- 一、命令介绍
- 二、命令格式
- 三、常用选项
- 四、sed 子命令
- 五、sed 替换标记
- 六、sed 元字符集
- 七、命令示例
- (一)用指定的字符串替换掉指定的字符串
- (二)删除文档中的空白行
- (三)删除文档中的注释
- (四)显示文档中除了首行的所有内容
- (五)查看包含指定字符串的行
- (六)删除每行行尾的空白字符
- (七)删除文档中的指定的字符串
- (八)查看文档中指定行的内容
- (九)本地修改文件内容
- 八、参考文献
sed
是一种流编辑器,它是文本处理中常用的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed
命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或者使用选项 -i/-I
。sed
主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
三、常用选项
选项说明-e
或--expression=
以选项中所指定的 script 来处理输入的文本文件,不写 -e
,直接跟着脚本也可以执行-f
或--file=
以选项中指定的 script 文件来处理输入的文本文件-I
就地编辑文件,以指定的扩展名保存备份。如果提供零长度扩展名,则不会保存备份。不建议在就地编辑文件时提供零长度扩展名,因为在磁盘空间耗尽等情况下,可能会导致新创建的文件被损坏或内容不完整-i
与 -I
类似,就地编辑文件,但将每个文件独立于其他文件进行处理。特别是,每个文件中的行号从1开始,$
地址与当前文件的最后一行匹配,并且地址范围仅限于当前文件。最终结果就像每个文件都由单独的 Sed 实例编辑一样-h
或--help
显示帮助-n
或--quiet
或--silent
仅显示 script 处理后的结果,也就是取消自动打印模式空间。sed 处理文本的时候会把被处理的文本缓存在模式空间中,如果不加这个选项,默认会把模式空间的内容打印出来,就会出现重复的情况-V
或--version
显示版本信息
四、sed 子命令
命令说明a\
在当前行下面插入文本i\
在当前行上面插入文本c\
把选定的行改为新的文本d
删除,删除选择的行D
删除模板块的第一行s
替换指定字符h
拷贝模板块的内容到内存中的缓冲区H
追加模板块的内容到内存中的缓冲区g
获得内存缓冲区的内容,并替代当前模板块中的文本G
获得内存缓冲区的内容,并追加到当前模板块文本的后面l
列表不能打印字符的清单n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码p
打印模板块的行P
大写的 P
打印模板块的第一行q
退出Sedb lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾r file
从file中读行t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾w file
写并追加模板块到file末尾W file
写并追加模板块的第一行到file末尾!
表示后面的命令对所有没有被选定的行发生作用=
打印当前行号码#
把注释扩展到下一个换行符以前
五、sed 替换标记
命令说明g
表示行内全面替换p
表示打印行w
表示把行写入一个文件x
表示互换模板块中的文本和缓冲区中的文本y
表示把一个字符翻译为另外的字符(但是不用于正则表达式)\1
子串匹配标记,引用前面第 1 个小括号的内容。例如,s/\(love\)able/\1rs/
,s
表示替换的指令,第 1 个双正斜杠 //
之间的内容是被替换的内容,\1
引用前面小括号的内容,也就是 love
,所以替换的字符串就是 lovers
,于是 loveable
被替换成 lovers
。&
已匹配字符串标记
六、sed 元字符集
表达式说明^
匹配行开始的位置。例如,/^sed/
匹配所有以sed开头的行。$
匹配行结束的位置。例如,/sed$/
匹配所有以sed结尾的行。.
匹配非换行符的任意一个字符,例如,/s.d/
匹配 s 后面跟着任意一个字符,最后是 d 的字符串。*
表示之前的字符连续出现任意次数(包括 0 次)将会被匹配到。例如,/*sed/
匹配前面有任意个空格的字符串 sed。[]
表示指定范围内的任意单个字符,例如,/[sS]ed/
匹配 sed 和 Sed。[^]
表示不在指定范围内的任意单个字符。&
保存搜索字符用来替换其他字符,例如,s/love/ **&**/
,love
被替换成 **love**
。\/
匹配以 love 结尾的单词。x\{m\}
重复字符 x,m次,例如,/0\{5\}/
匹配 00000
。x\{m,\}
重复字符 x,至少 m 次,例如,/0\{5,\}/
匹配 00000
、000000
、0000000
等。x\{m,n\}
重复字符 x,至少 m 次,最多 n 次。
七、命令示例
(一)用指定的字符串替换掉指定的字符串
如下例子,执行指定替换脚本,这个脚本其实是一个替换指令,结合了正则表达式去匹配目标,然后替换成指定的内容。
将文档 example.txt 中的 “string1” 替换成 “string2”:
sed -e 's/string1/string2/g' example.txt
注:选项 -e
可以省略掉
用单个零替换多个零,即多个零替换成单个零,即多个零被替换成单个零,即单个零替换掉多个零:
sed -e 's/000*/0/g' example.txt
注:不是真的把文档中指定的内容替换掉,只是输出到终端的内容是替换之后的内容
(二)删除文档中的空白行将文档 example.txt 的空白行删除:
sed '/^$/d' example.txt
注意:不是真的删除文档内容,只是输出到终端显示的内容是删除后的内容,换句话说仅作用于输出的内容。
我这里有个 txt 文件,先看看内容:
[root@htlwk0001host ~]# cat -n test/text.txt
1 The tempo of modern civilization has been much quickened in the last twenty years。
2 Whilestring1 witnessingstring1 the dramatic changes in the better-off society,
3 # people begin to reconsider thestring1 question of "survival"。 "Survival" in the old
4 se
5
6 nse does not bother us anymore。string1 , we are more concerned about how to
7 #"survive" in the human world full of petition。
我们看到第 5 行是空白行,我们再执行下面这个删除空白行的命令:
[root@htlwk0001host ~]# sed '/^$/d' test/text.txt
The tempo of modern civilization has been much quickened in the last twenty years。
Whilestring1 witnessingstring1 the dramatic changes in the better-off society,
# people begin to reconsider thestring1 question of "survival"。 "Survival" in the old
se
nse does not bother us anymore。string1 , we are more concerned about how to
#"survive" in the human world full of petition。
我们看到了,空白行已经被删除了,那么实际的文档中是不是真的删除了呢,其实并没有,重复的内容我就不展示了。
(三)删除文档中的注释删除文档 example.txt 中所有的注释内容和空白行:
sed '/ *#/d; /^$/d' example.txt
注:*#
可以匹配到文档的所有 #
,*
表示前面的空格匹配任意个;d
会把含有 #
的行整行删掉;^$
匹配空白行,匹配到后执行删除指令 d
,即把空行删除;分号 ;
表示目录的串行,即前面一个命令执行完后接着执行后面的命令
其实上面这个脚本不够精确,因为把含有 #
的行整行删除显然是极端的,实际应该把 #
到行尾之间的内容删除才合理,所以应该执行下面的脚本:
[root@htlwk0001host ~]# sed 's/^ *#.*$/d' test/text.txt
The tempo of modern civilization has been much quickened in the last twenty years。
Whilestring1 witnessingstring1 the dramatic changes in the better-off society,
sense does not bo
(四)显示文档中除了首行的所有内容
sed -e '1d' result.txt
注:1 表示第 1 行,显然 2 就表示第 2 行,d 把匹配到的行删除。
(五)查看包含指定字符串的行查看包含字符串 string1
的行:
[root@htlwk0001host ~]# sed -n '/string1/p' test/text.txt
Whilestring1 witnessingstring1 the dramatic changes in the better-off society,
people begin to reconsider thestring1 question of "survival"。 "Survival" in the old
sense does not bother us anymore。string1 Instead, we are more concerned about how to
[root@htlwk0001host ~]#
-n
表示取消自动打印模式空间,p
表示打印行,去掉 -n
就会把模式空间的内容也打印出来,如下所示:
[root@htlwk0001host ~]# sed '/string1/p' test/text.txt
The tempo of modern civilization has been much quickened in the last twenty years。
Whilestring1 witnessingstring1 the dramatic changes in the better-off society,
Whilestring1 witnessingstring1 the dramatic changes in the better-off society,
people begin to reconsider thestring1 question of "survival"。 "Survival" in the old
people begin to reconsider thestring1 question of "survival"。 "Survival" in the old
sense does not bother us anymore。string1 Instead, we are more concerned about how to
sense does not bother us anymore。string1 Instead, we are more concerned about how to
"survive" in the human world full of petition。
(六)删除每行行尾的空白字符
sed -e 's/ *$//' example.txt
s
表示替换,*
表示任意数量,*
前面是空格,表示匹配任意个空格,$
表示行尾的位置,说明是匹配行尾的任意个空白字符(空格),然后替换成第 2
个双正斜杠 //
之间的内容,此内容为空,所以替换后就相当于删除了所有行尾的空格。
删除文档中所有字符串 string1:
sed -e 's/string1//g' example.txt
(八)查看文档中指定行的内容
查看文档中从第 1行到第 5 行的内容:
[root@htlwk0001host ~]# sed -n '1,5p;5q' test/text.txt
The tempo of modern civilization has been much quickened in the last twenty years。
Whilestring1 witnessingstring1 the dramatic changes in the better-off society,
people begin to reconsider thestring1 question of "survival"。 "Survival" in the old
sense does not bother us anymore。string1 Instead, we are more concerned about how to
"survive" in the human world full of petition。
后面这个 5q 是啥意思??
查看第 5 行:
[root@htlwk0001host ~]# sed -n '5p;5q' test/text.txt
"survive" in the human world full of petition。
(九)本地修改文件内容
将文件 text2.txt
内的多个 0
替换成 lwx
,并且备份原文件,且在原文件扩展名后加上 bk
作为备份文件的扩展名:
[root@htlwk0001host test]# sed -ibk 's/000*/lwx/g' text2.txt
执行完上述命令后,原文件内容被真实修改了,而且多出一个原文件的备份文件:
[root@htlwk0001host test]# ls
text2.txt text2.txtbk
八、参考文献
在线工具
AWK程序设计语言