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。

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。