sed
主要用来自动编辑一个或多个文件、简化对文件的反复操作
-e:执行多个编辑命令 sed -e 's/foo/bar/g' -e 's/baz/qux/g' filename -f:从文件中读取编辑命令 sed -f scriptfile.txt filename -n:只输出匹配的行 sed -n '/pattern/p' filename -i:直接修改文件内容 sed -i 's/old/new/g' filename -r:使用扩展正则表达式 sed -r 's/[0-9]+/NUM/g' filename -h:显示帮助信息 sed -h -V:显示版本信息 sed -V a:在当前行后添加文本 sed '1a\new line' filename i:在当前行前插入文本 sed '1i\new line' filename c:替换选定的行 sed '2c\new line' filename d:删除选定的行 sed '2d' filename或者指定的sed '/xxxx/d'单词、sed '$d'删除最后一行 s;替换指定的字符串 sed 's/old/new/g' filename p:打印选定的行 sed -n '2p' filename sed -n '$p'最后一行 q:退出sed sed '2q' filename N:将下一行的内容读入模式空间,并在其后附加一个换行符 g:全局替换,即替换每一行中的所有匹配项 r;从文件中读取行 sed '2r newfile.txt' filename w:将选定的行写入文件 sed -n '2w newfile.txt' filename \n:表示新行
():分组,用于捕获子表达式。sed -E 's/(abc)def/\1XYZ/g' 将把 abcdef 替换为 abcXYZ \:转义字符,用于转义特殊字符。sed 's/\./-/g' 将把所有的 . 替换为 -。 \1, \2, ...:引用前面的捕获组。sed 's/$abc$$def$/\2\1/g' 将把 abcdef 替换为 defabc sed 's/xxx/ccc/':替换文件中的xxx替换成ccc,只不过只替换一次及终止在这一行的操作 sed 's/xxx/ccc/g':替换文件中的xxx替换成ccc,全部替换掉(g全局) sed -n s'/root/123/pg':显示替换的行 sed -n '/123/,/321/p':取123到321的值 sed 's#[0-9]#<666>#g':用于将文件中所有的数字(0-9)替换为 <666>。这里使用了方括号 [] 来定义字符类 sed 'N; s/\n/ /':将模式空间中的换行符替换为空格
取出第3行
sed -n '3p' /etc/passwd
取出第1行,到第5行之间,替换以root开头的行,用xxx来替换,并显示替换的行
sed -n '1,5s/root/xxx/pg' /etc/dmxsp
取出日志中16:02到16:30日志
sed -n ‘/16:02:54/,/16:39:37/p’ access.log |less
在/etc/ssh/sshd_config 最后增加内容
sed ‘$a Port=22\nPermitRootLogin=no\nUseDNS=no\nGSSAPIAuthcation=no’
把文件中的回车替换为空格
[root@master ~]$ seq 10
1
2
3
4
5
6
7
8
9
10
[root@master ~]$ seq 10 | sed ‘N;s#\n# #g’
1 2
3 4
5 6
7 8
9 10
[root@master ~]$ seq 10 | sed ‘N;N;N;N;N;N;N;N;N;s#\n# #g’
1 2 3 4 5 6 7 8 9 10
[root@master ~]$ seq 5 | sed ‘:label ;N;s#\n# #g;p; t label ‘
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5
:label:定义一个标签 label,用于循环。
N:将下一行读入模式空间,并在其后附加一个换行符。
s#\n# #g:将模式空间中的所有换行符 \n 替换为空格 。
p:打印模式空间的内容。
t label:如果上次替换操作成功,则跳转到标签 label 继续执行。
详细步骤
初始状态:
模式空间为 1。
第一次循环:
N:模式空间变为 1\n2。
s#\n# #g:模式空间变为 1 2。
p:打印 1 2。
t label:跳转到 label。
第二次循环:
N:模式空间变为 1 2\n3。
s#\n# #g:模式空间变为 1 2 3。
p:打印 1 2 3。
t label:跳转到 label。
第三次循环:
N:模式空间变为 1 2 3\n4。
s#\n# #g:模式空间变为 1 2 3 4。
p:打印 1 2 3 4。
t label:跳转到 label。
第四次循环:
N:模式空间变为 1 2 3 4\n5。
s#\n# #g:模式空间变为 1 2 3 4 5。
p:打印 1 2 3 4 5。
t label:跳转到 label。
第五次循环:
N:模式空间变为 1 2 3 4 5\n(已经没有下一行,所以 N 不再添加新的行)。
s#\n# #g:模式空间仍然是 1 2 3 4 5(没有换行符,所以替换操作不成功)。
p:打印 1 2 3 4 5。
t label:不再跳转,退出循环。
[root@master ~]$ seq 5 | sed ‘:label ;N;s#\n# #g; t label ;p’
1 2 3 4 5
详细步骤
初始状态:
模式空间为 1。
第一次循环:
N:模式空间变为 1\n2。
s#\n# #g:模式空间变为 1 2。
t label:跳转到 label。
第二次循环:
N:模式空间变为 1 2\n3。
s#\n# #g:模式空间变为 1 2 3。
t label:跳转到 label。
第三次循环:
N:模式空间变为 1 2 3\n4。
s#\n# #g:模式空间变为 1 2 3 4。
t label:跳转到 label。
第四次循环:
N:模式空间变为 1 2 3 4\n5。
s#\n# #g:模式空间变为 1 2 3 4 5。
t label:跳转到 label。
第五次循环:
N:模式空间变为 1 2 3 4 5\n(已经没有下一行,所以 N 不再添加新的行)。
s#\n# #g:模式空间仍然是 1 2 3 4 5(没有换行符,所以替换操作不成功)。
t label:不再跳转,退出循环。
p:打印 1 2 3 4 5。