sed 主要是用来将数据进行选取、替换、删除、新増的命令。我们看看命令的语法:
[root@localhost ~] # sed [选项] '[动作]' 文件名
选项:-n:一般 sed 命令会把所有数据都输出到屏幕上。如果加入此选项,则只会把经过 sed 命令处理的行输出到屏幕上;-e: 允许对输入数据应用多条 sed 命令编辑;-f 脚本文件名:从 sed 脚本中读入 sed *** 作。和 awk 命令的 -f 选项非常类似;-r:在 sed 中支持扩展正则表达式;-i:用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作;a \:追加,在当前行后添加一行或多行。当添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结;c \:行替换,用c后面的字符串替换原数据行。当替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结;i \:插入,在当前行前插入一行或多行。当插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结;d:删除,删除指定的行;P:打印,输出指定的行;s:字符串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字串/新字串/g”(和Vim中的替换格式类似);大家需要注意,sed 所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,则连文件都没有),而是把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。
行数据 *** 作举几个例子来看看 sed 命令到底是干什么的。假设我想查看一下 student.txt 文件的第二行,就可以利用"p"动作了。
[root@localhost ~]# sed '2p' student.txt
ID name PHP linux MySQL Average
1 liming 82 95 86 87.66
1 liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[root@localhost ~]# sed -n '2p' student.txt
1 liming 82 95 86 87.66
再来看看如何删除文件中的数据:
[root@localhost ~]#sed '2,4d' student.txt
#删除从第二行到第四行的数据
ID name PHP linux MysqL Average
[root@localhost ~]# cat student.txt
#文件本身并没有被修改
ID name PHP linux MysqL Average
1 liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
看到这条命令首先需要注意,所有的动作必须使用"单引号"包含;其次,在动作中可以使用数字代表行号,逗号代表连续的行范围。还可以使用"$"代表最后一行,如果动作是"2,$d",则代表从第二行删除到最后一行。
再来看看如何追加和插入行数据:
[root@localhost ~]# sed '2a hello' student.txt
#在第二行后加入hello
ID name PHP linux MysqL Average
1 liming 82 95 86 87.66
hello
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[root@localhost ~]# sed '2i hello > world' student.txt
#在第二行前插入两行数据
ID name PHP linux MysqL Average
hello
world
1 liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
再来看看"-n"选项的作用,命令如下:
[root@localhost ~]# sed -n'2i hello \
#只查看sed命令 *** 作的麵
world' student.txt
hello
world
再来看看如何实现行数据替换:
[root@localhost ~]# cat student.txt | sed '2c No such person'
ID name PHP linux MysqL Average
No such person
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
第二行数据变成了 "查无此人"。通过这个例子我们看到了,sed 也可以接收和处理管道符传输的数据。
sed 命令在默认情况是不会修改文件内容的。如果我确定需要让 sed 命令直接处理文件的内容,则可以使用"-i"选项。不过要小心,这样非常容易误 *** 作,在 *** 作系统文件时请小心谨慎。可以使用这样的命令:
[root@localhost ~]# sed -i'2c No such person' student.txt
字符串替换"c"动作是进行整行替换的,如果仅仅想替换行中的部分数据,就要使用"s"动作了。"s"动作的格式如下:[root@localhost ~]# sed's/旧字符串/新字符串/g' 文件名
替换的格式和 Vim 非常类似,例如:[root@localhost ~]# sed '3s/74/99/g' student.txt
#在第三行中,把74换成99
ID name PHP linux MysqL Average
1 liming 82 95 86 87.66
2 Sc 99 96 87 85.66
3 Gao 99 83 93 91.66
如果想把某行的成绩注释掉,让它不再生效,则可以这样做:
[root@localhost ~]#sed '4s/^/#/g' student.txt
#在这里使用正则表达式,"^"代表行首
ID name PHP linux MysqL Average
1 liming 82 95 86 87.66
2 Sc 74 96 87 85.66
#3 Gao 99 83 93 91.66
不仅如此,我们还可以这样做:
[root@localhost ~]# sed -e 's/liming//g; s/Gao//g' student.txt
#同时把"liming"和"Gao"替换为空
ID name PHP linux MysqL Average
1 82 95 86 87.66
2 Sc 74 96 87 85.66
3 99 83 93 91.66
"-e"选项可以同时执行多个 sed 动作,当然,如果只执行一个动作,则也可以使用"-e"选项,但是这时没有什么意义。还要注意,多个动作之间要用";"或回车分隔,例如,上一条命令也可以这样写:
[root@localhost ~]# sed -e 's/liming//g
> s/Gao//g' student.txt
ID name PHP linux MysqL Average
1 82 95 86 87.66
2 Sc 74 96 87 85.66
3 99 83 93 91.66
以上是内存溢出为你收集整理的shell sed命令详解:选取、替换、删除、新増数据全部内容,希望文章能够帮你解决shell sed命令详解:选取、替换、删除、新増数据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)