首先看一下我们的练习用的文本,example.txt
$ cat example.txt
This is a test file.
It is the last day of 2018.
Hope all you success!
HAPPY NEW YEAR!
-e:执行多个命令
通常情况下,sed后面只能跟一个命令。当然你可以使用管道符号“|‘执行多个命令,比如,我要把”last“替换成”first“,把”2018“替换成”2019“, 使用管道符号:
sed "s/last/first/g" example.txt | sed "s/2018/2019/g"
第一个sed的标准输出作为第二个sed的标准输入。 当然更为简洁的方式是使用-e参数,一个sed可以执行多个命令。
sed -e "s/last/first/g" -e "s/2018/2019/g" example.txt
# This is a test file.
# It is the first day of 2019.
# Hope all you success!
# HAPPY NEW YEAR!
-f:声明sed脚本文件
新建文本文件example.sed,并在文本中输入:
s/last/first/g
s/2018/2019/g
注意在文件中不需要引号,然后在命令行执行该文件:
sed -f example.sed example.txt
# This is a test file.
# It is the first day of 2019.
# Hope all you success!
# HAPPY NEW YEAR!
将命令写出脚本文件适用于命令很多或者经常使用的情况。
声明行
使用行号声明行
直接在s前面添加行号,来告诉sed要执行的行。 比如我们要将第2行的is替换成was:
sed '2s/is/was/g' example.txt
# This is a test file.
# It was the last day of 2018.
# Hope all you success!
# HAPPY NEW YEAR!
如果要声明范围,可以使用逗号“,”将行号分割开。比如将example.txt的第2-4的大写字母全部改成小写。
sed '2,4s/[A-Z]/\L&/g' example.txt
# This is a test file.
# it is the last day of 2018.
# hope all you success!
# happy new year!
通过正则表达式声明行 我们不仅可以通过行号告诉sed要进行操作的行,还可以通过正则表达式筛选出要操作的行。注意正则表达式要放在斜杠之内。 比如,我们要筛选出以叹号(!)结尾的行,将这些行中的所有大写字母变成小写字母。
sed '/!$/s/[A-Z]/\L&/g' example.txt
# This is a test file.
# It is the last day of 2018.
# hope all you success!
# happy new year!
其中“!$”表示以叹号结尾的行。 和通过数字声明行范围一样,通过正则表达式同样可以声明行范围。比如我们要将从倒数第二个字符是数字[0-9]到倒数第一个字符是叹号之间的行的所有大写字母变成小写。
sed '/[0-9].$/,/!$/s/[A-Z]/\L&/g' example.txt
# This is a test file.
# it is the last day of 2018.
# hope all you success!
# HAPPY NEW YEAR!
可以看出结合正则表达式,sed可以完成非常复杂的操作。
d:删除行
通过s参数主要完成查找和替换的作用,而通过d参数则可以删除某行。 比如,我们要删除1-3行:
sed '1,3d' example.txt
# HAPPY NEW YEAR!
如果我们想删除第1行和第3行,可以通过分号“;”将两个命令分割:
sed '1d;3d' example.txt
# It is the last day of 2018.
# HAPPY NEW YEAR!
当然,这里同样可以通过正则表达式指定要删除的行,不再举例。
p:输出行
之前已经介绍过了,经常和“-n”一起使用,输出特定行。比如一个很大的文件,我想查看它的第9999行,则可以 sed -n '9999p' filename
通过!进行反向选择 在正则表达式中“!”可以表是“否”的意思,所以,如果我要选择出example.txt中不含数字的行:
sed -n '/[0-9]/!p' example.txt
# This is a test file.
# Hope all you success!
# HAPPY NEW YEAR!
总结d,p和!
参数d用于删除,参数p用于输出,相当于保留,参数!表示反向选择。所以通过它们的不同组合可以完成相同的目的,下面是这3个参数不同的组合例子
**** 百读不如一练 ****
===== THE END ====
参考资料:http://www.grymoire.com/Unix/Sed.html#uh-30