http://www.7880.com/info/2004/12/03/article-9952.html
http://blog.chinaunix.net/u1/38994/showart_1739302.html
http://blog.chinaunix.net/u1/38994/showart_1784759.html

基本sed编辑命令

代码:
sed编辑命令
p 打印匹配行
P 将模式空间中的第一行内容输出到标准输出
= 显示文件行号
a \ 在定位行号后附加新文本信息
i \ 在定位行号后插入新文本信息
d 删除定位行
D 删除模式空间内的第一行
c \ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
N 读入下一行,将其追加到模式空间尾,当前行号加1
y 转换字符,比如小写转大写
  比如:luther@gliethttp:/vobs/sed$ sed -e 'y/abcdef/ABCDEF/' b.txt
  这样b.txt中的所有abcdef都将转为相应的大写字母,y操作不支持[a-z]正则表达式
  或者:luther@gliethttp:/vobs/sed$ sed -e 'y/abcdef/123456/' b.txt
  这样b.txt中的所有abcdef都将转为相应的123456.
n 延续到下一输入行;允许跨行的模式匹配语句
h 用模式空间内容替换后备空间内容
H 将模式空键内容追加到后备空间尾
g/G  同h/H,但方向相反,后备空间->模式空间
x 交换模式空间和后备空间内容
l 输出模式空间内容到标准输出,以更人性话的方式输出
  比如:luther@gliethttp:/vobs/sed$ sed -ne 'l' b.txt
! 对不符合条件的行执行后续命令操作,
  比如:luther@gliethttp:/vobs/sed$ sed  -e '/luther/! d' b.txt
       将只输出含有luther的行
       luther@gliethttp:/vobs/sed$ sed -n -e '/luther/!p' b.txt
  加入-n表示强制不输出pattern space模式空间中的内容到stdout,如果不加,那么b.txt的每一行都将输出




luther@gliethttp:/vobs/sed$ sed 'n;n;d' b.txt
表示从第1行开始,n取出下一行,然后n再取出下一行,然后对第3行进行d删除操作,同时行号自动增加,
所以当执行完d操作之后,将取第4行,所以这样将只显示
1,2
4,5
7,8
对3的倍数行执行删除操作
如果
luther@gliethttp:/vobs/sed$ sed 'n;d' b.txt
那么就是对2的倍数行进行删除操作.

luther@gliethttp:/vobs/sed$ sed '/^$/d' b.txt
删除所有空行

luther@gliethttp:/vobs/sed$ sed '/^$/d;G' b.txt
删除所有空行,同时使用G在非空行后面添加一个空行
sed如果发现/^$/满足,那么执行d删除操作,因为模式空间中的内容已将清除,所以后续的对该行的所有操作命令将不会被执行,sed命令将继续取出下一行,所以如果/^$/d执行,那么sed将执行不到;G命令就提前退出了,进行下一行数据操作了.

luther@gliethttp:/vobs/sed$ sed 's/^/# /' b.txt
在每行的开头添加'# '

luther@gliethttp:/vobs/sed$ sed 's/^.\{7\}//' b.txt
将b.txt文件每行的前7个字节删除

luther@gliethttp:/vobs/sed$ sed 's/$/] /' b.txt
在每行的结尾添加'] '




在vim中
:%s/^..//
这将删除每行的前2个字节
:%s/..$//
这将删除每行结尾的2个字节
:%s/^.\{7\}//
这将删除每行的前7个字节
:%!sed '/status="/a \echo $status'
在含有status="的行后面追加echo $status字符串


:%!sed '/[ -z "$result" ] && echo/r a.c'
向[ -z "$result" ] && echo字符串所在行的下一行追加a.c文件中的内容
:%!sed '/[ -z "$result" ] && echo/d'
删除[ -z "$result" ] && echo字符串所在行
这样组合之后,就可以替换文件中的一行数据为多行a.c文本中的数据



正则表达式的*表示该*前面的字符重复任意次,即:0次或者无数次,所以如果只写*号那么将不起任何作用,
所以如果想删除每行开头的所有空行或者空格,那么需要按如下方式写:
luther@gliethttp:/vobs/sed$ sed 's/^[ \t]*//' b.txt
这样就表示[ \t]这两个字符将使用*操作,重复0次或者无数次,当然也可以使用如下语句指定至少出现1次
luther@gliethttp:/vobs/sed$ sed 's/^[ \t]\{1,\}//' b.txt




只打印第二行,用-n
sed -n '2p' quote.txt
打印1到3行
sed -n '1,3p' quote.txt
打印含有'The'字符的行
sed -n '/The/p' quote.txt
打印含有'$'符号的行
sed -n '/\$/p' quote.txt
这个模式查询以i n g结尾的任意单词
sed -n '/.*ing/p' quote.txt
打印输出行范围设为第一行到最后一行1 , $。$意为最后一行
sed -n '1,$p' quote.txt
要打印行号,使用等号=。打印模式匹配的行号
整个文件都打印出来,并且匹配行打印了行号。如果只关心实际行号,使用- e选项。
sed -e '/music/=' quote.txt
如果只打印行号及匹配行,必须使用两个s e d命令,并使用e选项。第一个命令打印模式匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=
sed -n -e '/music/p' -e '/music/='  quote.txt
插入命令类似于附加命令,只是在指定行前面插入
sed "/company/i\Utter confusion followed." quote.txt
修改文本修改命令将在匹配模式空间的指定行用新文本加以替代
sed "/honeysuck/c\The Office Dibble band played well." quote.txt
删除文本
删除第一行;1 d意为删除第一行
sed '1d' quote.txt 2
删除第一到第三行
sed '1,3d' quote.txt
删除最后一行
sed '$d' quote.txt
也可以使用正则表达式进行删除操作
sed '/Neave/d' quote.txt
s选项通知s e d这是一个替换操作
's/{old value}/{new value}/'
替换选项如下:
引用:
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p 缺省s e d将所有被替换行写入标准输出,加p选项将使- n选项无效。- n选项不打印输出结果。
w 文件名使用此选项将输出定向到一个文件。
sed 's/night/NIGHT/' quote.txt
删除$ 符号
sed 's/\$//' quote.txt
全局替换
sed 's/The/Wow/g' quote.txt
将替换结果写入一个文件用w选项,下面的例子将splendid替换为SPLENDID的替换结果写入文件sed.out:
sed 's/splendid/SPLENDID/w sed.out' quote.txt
使用替换修改字符串
如果要附加或修改一个字符串,可以使用(&)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面。
先给出一个被替换模式,然后是一个准备附加在第一个模式后的另一个模式,并且后面带有&,这样修改模式将放在匹配模式之前。
sed -n 's/nurse/"hello" &/p' quote.txt
sed -n 's/played/from Hockering &/p' quote.txt
将sed结果写入文件命令
sed '1,2 w filedt' quote.txt
从文件中读文本
address r filename
这里r通知sed将从另一个文件源中读文本
sed '/company./r sedex.txt' quote.txt
匹配后退出
下面的例子假定查询模式/ . a . * /,意为任意字符后跟字符a,再跟任意字符0次或任意多次。
查询首次出现模式,然后退出。需要将q放在s e d语句末尾。
sed '/.a.*/q' quote.txt
处理控制字符
使用s e d实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符
假定希望用 "2" 来替换 "1",但仅在单词 "two" 之后才作替换,而不是每一行的所有位置
sed '/two/ s/1/2/' sample_one
sed '/two/ s/1/2/; /three/ s/1/3/; /^$/ d' sample_one
从第一行直到第一个空行:
sed '1,/^$/ d' {filename}
这将文本添加到第 3 行之后
sed '3i\This is where we stop the test' sample_one

保持和获取:h命令和G命令
$ sed -e '/test/h' -e '$Gexample-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

保持和互换:h命令和x命令
$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。



09-15 03:07