sed(strem editor,流编辑器)是一个面向行处理的工具,以“行”为单位,处理后的结果会输出到标准输出(stdout)。
一、工作原理
处理时,sed会把要处理的行存储在缓冲区中,然后再用sed命令处理缓冲区中的内容,最后将缓冲区的内容送到屏幕显示,一次一行,不断重复。这个缓冲区被称为 “模式空间”(pattern space)。
二、sed命令格式:
sed [option] {sed-command} {file}
1、option
- -e<script>或–expression=<script> ——以选项中指定的script来处理输入的文本文件
【用来设置多个command】 - -f<script文件>或–file=<script文件> ——以选项中指定的script文件来处理输入的文本文件。
- -h或–help ——显示帮助。
- -n或–quiet或–silent ——仅显示script处理的那几行,不会完整的显示处理后的文件。
- -V或–version ——显示版本信息。
- -i ——直接修改读取的文件内容,而不是输出到终端。
-e 选项用来设置多条命令
Eg: sed -n -e ‘1,2p’ -e ‘4p’ mysed.txt
# 打印mysed.txt文件的第1到第2行,然后再打印第4行
注意:多个 command 之间,是按照在命令中的 先后顺序 来执行的。
-f 选项用来指定一个文件(该文件内写sed的command部分)作为当前sed命令的command部分
Eg: sed -n -e ‘1,2p’ -e ‘4p’ mysed.txt
# 打印mysed.txt文件的第1到第2行,然后再打印第4行
所以,并不会修改文件本身!
2、sed-command
可以分为两部分:1)范围设定;2)动作处理。
(1)、范围设定
采用两种不同的方式来表达:
1)指定行数:
Eg: “3, 5”表示第3到第5行,“5,$”表示第5行到最后一行。
2)模式匹配:
Eg: “/^[^dD]/”表示匹配行首不是以d或D开头的行。
(2)、动作处理
几个常用动作:
- d——表示删除整行
- p——打印该行
- r——读取指定文件的内容
- a——新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行),且自带换行!
- i——插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
- c——替换, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
- y——替换,逐字替换
- s——替换,可以直接进行替换的工作哩!通常这个 s 的动作可以搭配正则表达式
【Eg: “1,20 s/old/new/g”】 - n——将下一行内容放到处理缓存中,从而让当前这一行躲避开了替换动作
【Eg: sed ‘/200/{n;y/eijng/EIJNG/;}’ mysed.txt #实现了隔行修改的效果】 - w——写入指定的文件
【Eg: sed ‘/200[4-6]/w new.txt’ mysed.txt】
#注意:1、y和s动作的区别:
# y只是简单的逐字替换,没有很多花样;
# s支持&符号和预存储等特性,可以实现更灵活的替换效果
# 2、y动作后重复的字符只会识别一个,且只替换识别到的重复字符的第一个对应的字符
Eg: sed 'y/ee/ie/' mysed.txt # 这里只会将所有的e匹配为i
举例:
1、在testfile文件的第四行 后 添加一行,并将结果输出到标准输出
sed -e 4a\newLine testfile
2、在testfile文件的第四行 前 添加一行,并将结果输出到标准输出
sed -e 4i\newLine testfile
3、显示 test文件 的第10行到第20行的内容
sed -n '10,20p' test
4、将所有以 d 或 D 开头的行里的所有小写 x 字符变为大写 X 字符【*】
sed '/^[dD]/s/x/X/g' test
5、删除每一行的前两个字符
sed 's/..//' test
6、按照字符顺序实现前后的替换
sed 'y/ei/ie/' mysed.txt
(3)、特殊符号
a、&——表示的是“之前被匹配的部分”
Eg: sed 's/B.*/&2008/' mysed.txt
# 匹配以B开头的字符串所在的行,将匹配到的字符串变为匹配到的字符串后接2008
b、()——sed的预存储技术,用于将其存储到 \1、\2……
Eg: echo "hello world" | sed 's/\(hello\).*/world \1/'
# 将hello存储到 \1,然后将其存在world字符串后!