2014年11月12日

sed

一直都是断断续续的学习Sed和Awk,现在想正式了解其中的原理。现在先来学习Sed。

1 sed 's/abc/def/5,10' file 和 sed -i '5,10s/abc/def/g' file的区别

sed 's/abc/def/5,10' file 将第5行到第10行的abc改成def
sed '5,10s/abc/def/g' file 将一行的第5字段到第10字段的abc改为def

2 sed a 命令( append )
sed "1 a test abc" file 在第一行下面插入test abc 一行
sed "$ a test abc" file 在最后一行插入test abc一行
sed "/my/a test" file 在匹配my一行的下一行插入test一行

3 sed i 命令( insert )
与sed a命令相反,它是在前面插入一行
sed "1i test abc" file 在第一行上面插入新行
sed "/my/i test abc" file 在匹配my的一行上面插入一行

4 sed c 命令( replace )
sed "2 c test" file 将第二行全部内容替换为test
sed "/abc/c test" file 将有abc的一行替换为test

5 sed d 命令( delete )
sed "2d" file 将第二行删除
sed "/test/d" file 将匹配test的一行删除
sed "2,5d" file 将第2行到第5行删除

6 更有趣的是,sed有一个命令打包的东西,挺有意思的。
它们可以用分号分开,可以用大括号括起来作为嵌套命令
sed "3,6{/test/d}" file 将3到6中含有test字符的行删除
sed "3,6{/test/{/field/d}}" file 将3到6行中含有test和field的行删除
sed "1,${/test/d; s/^ $//g}" file 将整个文件中含有test的行删除和将空行删除
在这里将多个命令使用大括号或分号来分开和执行了

7 保留空间
保留空间
g: 将保留空间中的内容拷贝到匹配空间中,原来匹配空间里的内容清除
G: 将保留空间中的内容追加到匹配空间后面
h: 将匹配空间中的内容拷贝到保留空间中,原来的保留空间里的内容被清除
H: 将匹配空间中的内容追加到保留空间后面
x: 交换匹配空间和保留空间的内容

sed '1!G;h;$!d' file 倒序一个文件内容
1!G —— 只有第一行不执行G命令,将hold space中的内容append回到pattern space
h —— 第一行都执行h命令,将pattern space中的内容拷贝到hold space中
$!d —— 除了最后一行不执行d命令,其它行都执行d命令,删除当前行

来自 http://coolshell.cn/articles/9104.html