sed意为流编辑器( Stream Editor) ,在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是
把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。 sed和vi都源于
早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。
sed不直接修改文件,修改的是输出的内容,可以重定向输出到文件。
sed -n '1p' 1.dat>2.dat #打印1.dat的第一行到2.dat
sed命令行的基本格式为
sed option 'script' file1 file2 ...
sed option -f scriptfile file1 file2 ...
sed处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,命令行参数可以一次传
入多个文件, sed会依次处理。 sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文
件然后用-f参数指定,编辑命令的格式为
/pattern/action
其中pattern是正则表达式, action是编辑操作。 sed程序一行一行读出待处理文件,如果某一行
与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个action将作
用于待处理文件的每一行。
常用sed命令
命令 | 意义 |
---|---|
1p或2,4p或$p或2,4!p | 打印特定行 $p最后一行 2,4!p不在2-4范围的行 |
/pattern/p | 打印匹配pattern的行 |
/pattern/s/pattern1/pattern2/ | 查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2 |
/pattern/s/pattern1/pattern2/g | 查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2 |
**地址(行号或pattern)**d | 删除匹配pattern的行 |
**地址(行号或pattern)**i\insertcontent | 在匹配行所在行号前,插入insertcontent |
**地址(行号或pattern)**a\appendcontent | 在匹配行所在行号后,追加appendcontent |
**地址(行号或pattern)**c\appendcontent | 把匹配行所在行号修改replacement |
**地址(行号或pattern)**w output | 把匹配行写入文件output |
**地址(行号或pattern)**r input | 把文件input内容读入,并追加到地址之后 |
**地址(行号或pattern)**q | 执行完第一次匹配行就退出 |
地址(行号或pattern)= | 显示匹配的行号 |
y/abcd/ABCD | 字符序列变换,逐个处理 |
地址(行号或pattern){p;=} | 执行命令组,如不使用{}只能执行单个命令 |
sed -n '/abc/p' testfile
注意, sed命令不会修改原文件,删除命令只表示某些行不打印输出,而不是从原文件中删去。
使用查找替换命令时,可以把匹配pattern1的字符串复制到pattern2中,比如:
sed 's/bc/-&-/' testfile
123
a-bc-
456
pattern2中的&表示原文件的当前行中与pattern1相匹配的字符串。
sed 's/\([0-9]\)\([0-9]\)/-\1-~\2~/' testfile
-1-~2~3
abc
-4-~5~6
pattern2中的\1表示与pattern1的第一个()括号相匹配的内容, \2表示与pattern1的第二个()括号
相匹配的内容。
sed选项
选项 | 意义 |
---|---|
-n | 不打印源文本,默认将待处理文本每一行打印出来 |
-e | 将下一个字符串解析为sed命令,只有一个sed命令时,可以省略-e |
-f | 调用sed脚本 |