如果觉得对你有帮助,能否点个赞或关个注,以示鼓励笔者呢?!博客目录 | 先点这里
sed的使用格式通常有两种
stdout | sed [option] "pattern command"
sed [option] "pattern command" file
说白了,就三个概念要重点记住
-n
-e
sed '/python/ p' file
, 代表输出含python字符串的行。如果我们不仅想匹配带有python字符串的行,还想带java的行也输出怎么办?-e
就派上用场了。sed -e '/python/ p' -e /java p/ file
实现两个模式匹配,说白了当你只有一个sed编辑时,-e是隐式自带的。-f
sed -f sedfile file
, 载入sedfile的sed命令去处理file文件的行-r
sed -e '/python/ p' -e /java p/ file
。这时我们再想,如果我们可以使用正则表达式就好了,一个|
符号就解决了。所以sed提供了-r的支持正则表达式的选项。sed -r '/python|java/ p' file
-i
-i
就是sed命令的终结命令,将流处理后的结果覆盖到原数据中,会对原数据产生影响pattern就类似于正则表达式的模式匹配,在sed的格式规范中,sed的pattern是有由'/pattern/'
两个/
符号括起来的 。用于匹配目的行数据,让匹配行得以执行command命令
(一) 隔开pattern和command命令
分号;
隔开彼此,甚至不用隔开也行分号;
隔开彼此,也可以不隔开sed '/python/p' file
sed '/python/ p' file
sed 'python/;p' file
(二) pattern用法表
pattern支持单pattern匹配,也支持范围匹配,甚至全局匹配(没pattern就是处理所有行)。范围匹配呢,支持pattern之间,也支持数字之间,也支持pattern和数字混合式。注意在范围匹配中,如果文件中没有行数据匹配后面边界的pattern,那么他会匹配到文件末尾,比如从10行到文件末尾的所有行都执行command;同时如果范围匹配中,前面是模式匹配,后面是行数匹配,行数之前没有成功模式匹配,行数就会失效,称为普通的模式匹配
10command
10,20command
10,+5command
/pattern/command
/pattern1/,/pattern2/command
10,/pattern/command
/pattern/,10command
sed命令支持类似正则的匹配规则
/name/command
/^name/command
(一) 命令操作类型
command命令就是sed中的编辑命令, 主要就是对匹配行进行增
,删
,改
,查
的工作
查询
p
增加
a
i
r
w
删除
d
修改
s/old/new
s/old/new/g
s/old/new/2
s/old/new/2g
s/old/new/ig
其他编辑命令
=
(二) 反向引用延伸,变量
&和\1
反向引用,是模式匹配串的引用,比如sed 's/hello/& world/g' file
,就是将hello替换成hello world, &
和\1
可以作为old的对象引用 。
\1
比&
要更加灵活,\1
只引用括号内部的字符串,比如sed 's/\(he\)llo/\1 world/g' file
,将所有hello替换成he world, 记住()是特殊字符,需要转义
匹配模式pattern如果存在变量,既我们pattern中存在使用$variable的方式获取变量,建议使用双引号。比如 sed “s/$old/$new/g” file , 如果是单引号,pattern会把$old取变量的意思当做是"$old"字符串来处理
如果匹配模式pattern如果存在变量,你又想使用单引号来括住pattern, 那你的取变量也要被单引号括住吗,比如 sed ‘s/’$old’/’$new’/g’ file
I love python
I love PYTHON
hadoop is bigdata frame
sed 'p' hello
# output:
I love python
I love python
I love PYTHON
I love PYTHON
hadoop is bigdata frame
hadoop is bigdata frame
'p'
就是一个command, 代表打印的意思,因为我们没有写pattern, 所有该命令的意思就是打印所有的行。那么为什么会打印两遍?这就是sed的工作机制,首先第一遍是原行数据,第二遍是'p'
命令对原行执行命令的结果。我们可以通过option -n
去设置模式,只输出模式匹配行,不输出原行数据即可I love python
I love PYTHON
hadoop is bigdata frame
sed -n '/python/ p' hello
, 打印所有带有python字符串的行数据# output:
i love python
sed -n '/p.*/ p hello'
,打印所有带有p字符的行数据,p后面可以跟任何字符# output
I love python
hadoop is bigdata frame
1
2
3
4
5
6
7
sed -n '5,7p' hello
输出5到7行的数据# output:
5
6
7
sed -n '1,+3p' hello
输出1到1+3=4行的数据# output
1
2
3
4
sed -n '1,/6/p' hello
输出第1行到匹配带有6字符的行数据(如果多个地方有6,匹配到顺位第一个),重点!!如果没有任何数据带有6,那么它会匹配到文件末尾。# output
1
2
3
4
I love python
I love PYTHON
hadoop is bigdata frame
sed -i '2a hello world' hello && cat -n hello
, 在第2行后追加helloworld字符串并更新入原文件,并查看hello文件, 显示行号1 I love python
2 I love PYTHON
3 hello world
4 hadoop is bigdata frame
sed -i '2i hello world' hello && cat -n hello
, 在第2行前追加helloworld字符串并更新入原文件,并查看hello文件, 显示行号1 I love python
2 hello world
3 I love PYTHON
4 hadoop is bigdata frame
sed '2i r /etc/intput' hello
, 在第2行后追加/etc/intput文件中的文本内容sed '/python/i w /etc/output' hello
将所有带有python的行数据都写入外部文件/etc/output中I love python
I love PYTHON
hadoop is bigdata frame
sed -n '3d;p' hello
对第三行进行删除,然后输出删除后的结果I love python
I love PYTHON
sed -n -r '/python|PYTHON/ d;p' hello
删除带有python或PYTHON字符串的行,并输出剩余结果hadoop is bigdata frame
I love python
I love PYTHON
hadoop is bigdata frame
sed -n 's/love/hate/g p' hello
, 将行数据带有love字符串全部替换成hate字符串I hate python
I hate PYTHON
I love python
I love PYTHON
hadoop is bigdata frame
sed -n -r '/python|PYTHON/=' hello
,显示带有python或PYTHON字符串的行数据的行号1
2