作者写的英文手册原址:http://www.grymoire.com/unix/Sed.html#uh-30
1.sed总体执行流程
sed 命令:基本的模式为sed -[in] "[定位] cmd[;[定位] cmd]" 的模式,不加定位条件则表示一定执行命令。定位一般有两种,行号定位和使用正则表达式的模式匹配定位,行号定位有区间1,3和步长1~2两种方式。正则和行号定位可以混用。有些命令分为大小写,区分总体类似,但是存在细微的差别功能。
2.命令解释和样例
cmd | 作用 | 例子 |
a | 在当前行之后追加一行 | seq 6 | sed “3,/5/ a8” 3行直到第5行(匹配5),每行后增加一行,内容为8. |
c | 修改模式空间 | seq 6 | sed "3,/5/ c8" 3行直到第5行(匹配5),替换成一行,内容为8。(不是每行替换一个8) |
i | 在当前行之前插入一行 | seq 6 | sed “3,/5/ i8” 3行直到第5行(匹配5),每行前增加一行,内容为8. |
s | 替换匹配内容 | seq 6 | sed -r '3,/5/ s/[0-9]/8/' 3行直到第5行(匹配5),每行替换第一个数字为8. -r 表示使用扩展的正则表达式,部分系统不需要。 |
d/D | 删除模式空间所有行/删除模式空间首行。该命令终止之后的命令执行,会直接返回开始重新执行。 | seq 6 | sed '1d' 删除第一行 |
n/N | 取下一行覆盖到模式空间(无-n参数会先打印被覆盖的内容)/追加下一行到模式空间 | seq 6 | sed ':a;N;s/\n/ /;!$ba;' 本身并不显示,主要配合其他命令使用。例子是,将所有行合并为一行。:a是设置label。!$ba,表示不是最后一行,b(branch到)a继续执行。 注意使用单引号,$符号在shell和sed中都有含义,需要注意转义的使用情况。 |
p/P | 打印模式空间所有行/打印模式空间首行 | sed 6 | sed -n 'p;n' 打印奇数行;sed 6 | sed -n ''n;p" 打印偶数行 |
l | 打印模式空间,用于调试多行的sed脚本.(字母是小写的L)。类似于p,但是会把不可见字符按照c的风格显示。 | sed 6 | sed -n 'N;l' |
g/G | 从保持空间获取所有行 覆盖/追加 到模式空间 | 没什么用。需要使用到保持空间的复杂功能,使用shell的变成逻辑更好。没必要使用这个。用法可参考引文资料。他的例子有很多局限性,远不如shell自己实现逻辑。 |
h/H | 从模式空间复制内容 覆盖/追加 到保持空间 | 没什么用 |
: | 标签 | :a 标签a,可被b和t命令指定。 |
t | 测试命令。假如上一个s命令修改了模式空间,执行t命令指定的lable处。用来循环s命令的。 | echo 'aa((()))bb' | sed ':a;s/()//;ta' 一次替换掉所有的((()))。使用s的g参数只能删除一层。 |
b | 转到指定的标签 | |
y | 字符替换命令 | 没什么用。使用tr处理就好了。 |
= | 打印行号 | seq 6 | sed -n '$=' 打印总行数。 除了这个不知道有什么用。不如用其他工具。 |
3.总结
sed是个不错的文本编辑工具。不过常用的还是单条命令或者简单逻辑配合shell的逻辑控制。sed本身的脚本功能,略显鸡肋。