sed:输入流编辑器


对输入数据流进行编辑

1、命令格式

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

选项 内容
-n 只打印模式匹配的行
-e script 将脚本添加到要执行的命令中。直接在命令行模式上进行sed的动作编辑。
-f script-file 将脚本文件的内容添加到要执行的命令中。直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作。
--follow-symlinks 当处理到位时,遵循符号链接;硬链接仍然会中断。
-i[SUFFIX] 直接修改文件内容
-c 在-i模式下移动文件时使用copy而不是rename。
-l N 为“l”命令指定所需的行换行长度
--posix 禁用所有GNU扩展。
-r 在脚本中使用扩展正则表达式。(默认是基础正则表达式)
-s 将文件视为单独的而不是单个连续的长流。
-u 从输入文件中加载最小数量的数据,并更频繁地刷新输出缓冲区
--help 显示此帮助并退出
--version 输出版本信息并退出
常用命令
= 打印当前行号。
a \ 新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
i \ 插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)
q 立即退出sed脚本,不再处理任何输入,除非自动打印未禁用,否则将打印当前模式空间。
Q 立即退出sed脚本,不再处理任何输入。
r filename 附加从文件名读取的文本。
R filename 附加从文件名中读取的行。该命令的每次调用都从文件中读取一行。
{ 开始一个命令块(以一个}结束)。
b label 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾;
t label 如果s///在最后一行输入被读取之后,并且在最后一个t或t命令之后,已经成功地进行了替换,那么转移到label;如果标签被省略,分支到脚本的结尾。
T label 如果从最后一行输入和最后一个T或t命令开始,没有s///进行成功的替换,则转移到label;如果标签被省略,分支到脚本的结尾。
c \ 将选定的行替换为文本,其中每个文本都嵌入了换行符,换行符前面有一个反斜杠。
d 删除,删除选择的行;
D 删除模式空间中第一个内嵌的换行。
h/H 复制/追加模式空间以容纳空间。
g/G 复制/附加保持空间到模式空间。
x 交换hold和模式空间的内容。
l 以“清晰可见”的形式列出当前行。
l width 以“视觉上无歧义”的形式列出当前行,并在宽度字符处断开。
n/N 将下一行输入读入/追加到模式空间。
p 打印当前模式空间。打印,也就是将某个选择的数据打印出来,通常会和sed -n一起运行。
P 打印到当前模式空间的第一个内嵌换行。
s/正则表达式/更换/ 替换,可以直接进行替换工作。通常这个s的动作可以搭配正则表达式!例如1,20s/old/new/g
w filename 写并追加模板块到file末尾;
W filename 写并追加模板块的第一行到file末尾;
y/source/dest/ 将源文件中出现的模式空间中的字符转换为dest中相应的字符。

任何可显示的字符都可以扮演定界符的角色(比如分号、冒号、逗号或/),从而分隔正则表达式与替代文本。

sed也可以使用向后利用。如echo /home/test/ | sed 's;(/home)/test/;\1/t2/;'

&在替代文本里表示的意思是:从此点开始替代成匹配于正则表达式的整个文本。如果要在替代文本里使用&的字面意思,就需要用反斜杠进行转义

在s命令里以g结尾表示的是:全局性,即以”替代文本取代正则表达式中每一个匹配的“

echo Tolstoy reads well. Tolstoy writes well. >a.txt 
sed 's/Tolstoy/Camus/g' a.txt

后面以数字结尾,表示第N个匹配出现才要被取代

sed 's/Tolstoy/Camus/2' a.txt

给予sed多个命令是比较容易的。在命令行上,这是通过-e选项的方式来完成。每一个编辑命令都使用一个-e选项:

sed -e 's/Tolstoy/Camus/g' -e 's/reads/bbb/' a.txt

将编辑命令全部放在一个脚本里,在使用sed -f搭配

# cat b.txt 
s/old/new/g
s/ccc/ddd/
s/1111/222/

# sed -f b.txt a.txt 

sed的工作方式:命令行上的每个文件名会一次打开于读取。如果没有文件则使用标准输入,文件名"-"(单个破折号)可用于表示标准输入。sed读取每个文件,一次读一行,当多有操作(命令)完成后,sed会将模式空间的最后内容打印到标准输出,再回到开始处,读取另一个输入行。

sed打印:-n 于p搭配

sed -n 'aaa'p   a.txt

2、Sed的其他应用

2.1、匹配特定行:限制一条命令要应用到那些行,只要再命令前置一个地址即可。
命令形式:sed address commang

2.1.1、正则表达式:
①将一模式放置到一条命令之前,可限制命令应用于匹配模式的行。可与s命令搭配使用:

/oldfunc/   s/$/#xxx:migrate to newfunc/  注释部分源代码

②s命令里的空模式指的是"使用前一个正则表达式"

/Tolstoy/ s//& and Camus/g

2.1.2、最终行:符号$指"最后一行",指的是输入数据的最后一行。

sed -n '$p' "$1"           引号里为指定显示的数据

2.1.3、范围:可指定行的范围,仅需将地址以逗号隔开:

sed -n '10,40p'  foo.xml     仅打印10~40行
sed '/foo/,/bar/  s/a/b/g'    仅替换范围内的行;从含有foo的行开始,再匹配是否有bar开始的行,将匹配后的结果中a全部替换成b

2.1.4、否定正则表达式:将命令应用于不匹配与特定模式的每一行,通过将!加再正则表达式后面就可以。

sed '/used/!'s/new/used/g b         将没有used的每个行里所有的new改为used。!后不能跟空白

2.1.5、行标号:可以使用绝对的行编号作为地址。

2.2、

完全一致的匹配:自最左边开始匹配、针对每一个子模式、由左至右,必须匹配到最长的可能字符串。
echo Tolstoy is worldly | sed 's/T.*y/Camus/'

在文本查找时有可能会匹配到Null字符串。而在执行文本时,也允许你插入文本:
echo abc | sed -e s/1*/1/g