一起学习sed(二)

首先看一下我们的练习用的文本,example.txt

$ cat example.txt 
This is a test file.
It is the last day of 2018.
Hope all you success!
HAPPY NEW YEAR!

一起学习sed(二)

-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!

一起学习sed(二)

-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!

将命令写出脚本文件适用于命令很多或者经常使用的情况。

一起学习sed(二)

声明行

使用行号声明行

直接在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可以完成非常复杂的操作。

一起学习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!

当然,这里同样可以通过正则表达式指定要删除的行,不再举例。

一起学习sed(二)

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!

一起学习sed(二)

总结d,p和!

参数d用于删除,参数p用于输出,相当于保留,参数!表示反向选择。所以通过它们的不同组合可以完成相同的目的,下面是这3个参数不同的组合例子

一起学习sed(二)

百读不如一练

===== THE END ====

参考资料:http://www.grymoire.com/Unix/Sed.html#uh-30
一起学习sed(二)

猜你喜欢

转载自blog.51cto.com/15069450/2577357