分类: LINUX
2012-03-14 14:36:07
看看一行脚本的一些例子。
1. 删除路径名第一个/符号: pwd | sed ‘s/^////g’
2. 删除路径名中所有的/符号: pwd | sed ‘s/////g’
3. 追加/插入文本: sed ‘s/old/& add/g’ 1.txt
4. 删除首字符: sed ‘s/^.//g’ 1.txt
5. 删除文件扩展名: echo “1.txt” | sed ‘s/.txt//g’
6. 添加文件扩展名: echo “1” | sed ‘s/$/.txt/g’
7. ‘s / / . $ / / g’ 删除行末尾的句点
8. ‘s/ / . */ / g’删除行中所有的点
9. ‘-e /abcd/d’ 删除包含a b c d的行
10. ‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替
11. ‘s / ^ [ ] [ ] * / / g’ 删除行首空格
12. ‘s / / . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格
13. ‘/ ^ $ / d’ 删除空行
14. ‘s / ^ . / / g’ 删除第一个字符
15. ‘s /CO L / ( . . . / ) / / g’ 删除紧跟C O L的后三个字母
16. ‘s / ^ / / / / g’ 从路径中删除第一个/
17. ‘s / [ ] / [ ] / / g’ 删除所有空格并用t a b键替代
18. ‘S / ^ [ ] / / g’ 删除行首所有t a b键
19. ‘s / [ ] * / / g’ 删除所有t a b键
附:元字符集
^ 锚定行的开始 如:/^sed/匹配所有以sed开头的行。
$ 锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
* 匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
/(../) 保存匹配的字符,如s//(love/)able//1rs/,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
/< 锚定单词的开始,如://
/> 锚定单词的结束,如/love/>/匹配包含以love结尾的单词的行。
x/{m/}重复字符x,m次,如:/0/{5/}/匹配包含5个o的行。
x/{m,/} 重复字符x,至少m次,如:/o/{5,/}/匹配至少有5个o的行。
x/{m,n/}重复字符x,至少m次,不多于n次,如:/o/{5,10/}/匹配5--10个o的行。
文章出处:飞诺网():http://dev.firnow.com/course/3_program/shell/shelljs/200896/139779_3.html
2011-5-18 sed 再学习
基本sed编辑命令
p 打印匹配行
= 显示文件行号
a / 在定位行号后附加新文本信息:
[root@localhost hsyu]# cat new
adbfsdf d 123
[root@localhost hsyu]# sed -i '/123*/a/123 is good' new
[root@localhost hsyu]# cat new
adbfsdf d 123
123 is good
i / 在定位行号上插入新文本信息,注意是匹配的上一行插入
[root@localhost hsyu]# cat new
adbfsdf d 456
---------s----------
add
123 is good
[root@localhost hsyu]# sed '/456/i/insert by paramter i' new
insert by paramter i
adbfsdf d 456
---------s----------
add
123 is good
d 删除定位行
[root@localhost hsyu]# sed '/456/d' new
---------s----------
add
123 is good
c / 用新文本替换定位文本。 替换匹配的整行,注意是整行被替换
[root@localhost hsyu]# sed '/456/c/replace ' new
replace
---------s----------
add
123 is good
s 使用替换模式替换相应模式
r 从另一个文件中读文本. 文本里的内容被读进来,显示在与匹配的行后面,如果匹配多行,则文本的内容将显示在所有匹配行的下面
[root@localhost hsyu]# sed '/456/r a0' new
adbfsdf d 456
adbfsdf d^^^^^^123^M
^Z
---------s----------
add
123 is good
w 写文本到一个文件,注意指定被写入的文件的原有的内容会完全被删除,匹配的内容被写入指定文件
[root@localhost hsyu]# sed '/456/w a0' new
[root@localhost hsyu]# cat a0
adbfsdf d 456
q 第一个模式匹配完成后推出或立即推出
[root@localhost hsyu]# sed '2q' new
adbfsdf d 456
---------s----------
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组
n 延续到下一输入行;允许跨行的模式匹配语句。
[root@localhost hsyu]# sed '/456/{n;s/s/g/;}' new
adbfsdf d 456
---------g----------
add
123 is good
命令解析:如果匹配到456,那么就移动到该行的下一行,在找出这行的s替换成g。注意:替换只在匹配行的下一行进行,如果能匹配到多行的话则替换也进行多次
多点编辑:e命令
[root@localhost hsyu]# sed -e 's/is/iiis/' -e 's/s/g/' new -e '/good/a/two'
adbfgdf d 456
---------g----------
add
123 iiig good
two
add
选定行的范围:逗号
[root@localhost hsyu]# sed '/456/,/123/s/123/***/' new
adbfsdf d 456
---------s----------
add
*** is good
add
变形:y命令
[root@localhost hsyu]# sed 'y/abcd/ABCD/' new
ADBfsDf D 456
---------s----------
ADD
123 is gooD
ADD
将所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。如果想将小写字母替换成大写字母可用tr命令
[root@localhost hsyu]# sed 's/[a-z]/[A-Z]/' new
[A-Z]dbfsdf d 456
---------[A-Z]----------
[A-Z]dd
123 [A-Z]s good
[A-Z]dd
[root@localhost hsyu]# tr "[a-z]" "[A-Z]" < new
ADBFSDF D 456
---------S----------
ADD
123 IS GOOD
ADD
将数字换成字符
[root@localhost hsyu]# sed 'y/123/sss/' new
adbfsdf d 456
---------s----------
add
sss is good
add
保持和获取:h命令和G命令
[root@localhost hsyu]# sed -e '/456/h' -e '$G' new在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配456的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子当中,就是把匹配行就是追加到最后一行。简单来说,最后一个包含456的行被复制并追加到该文件的末尾。但是如果是 H, 则所有包含456的行都被复制并追加到该文件的末尾
[root@richard hsyu]# cat new
dfasdfsdf d 456
hello
-------------s-------------
123
123
456 new
hello
[root@richard hsyu]# sed -e '/456/H' -e '$g' new
dfasdfsdf d 456
hello
-------------s-------------
123
123
456 new
dfasdfsdf d 456
456 new
结果分析:如果用’g’,则末尾的内容被保持缓存中的内容替换。本例中,末尾的hello被保持缓存中的内容替换成 dfasdfsdf d 456 new。注意,无论末尾行是什么内容,末尾都会被替换。
[root@richard hsyu]# sed -e '/456/H' -e '$G' new
dfasdfsdf d 456
hello
-------------s-------------
123
123
456 new
hello
dfasdfsdf d 456
456 new
保持和获取:h命令和g命令 . 注意, 如果末尾行与匹配的内容一致,G是在末尾行追加, g是在末尾行替换
[root@richard hsyu]# sed -e '/456/h' -e '$G' new
dfasdfsdf d 456
hello
-------------s-------------
123
123
456 new
hello
456 new
[root@richard hsyu]# sed -e '/456/h' -e '$g' new
dfasdfsdf d 456
hello
-------------s-------------
123
123
456 new
456 new
保持和互换:h命令和x命令
互换模式空间和保持缓冲区的内容。也就是把模式空间中的内容替换成保持缓冲区的内容。注意参数“H”和“h”的区别,在这里x没有大写”X”这个参数,这点与“$g”不同。
[root@richard hsyu]# cat new
456inset
dfasdfsdf d 456
hello
-------------s-------------
123
123
456 new
hello
[root@richard hsyu]# sed -e '/456/H' -e '/123/x' new
456inset
dfasdfsdf d 456
hello
-------------s-------------
456inset
dfasdfsdf d 456
123
456 new
hello
[root@richard hsyu]# sed -e '/456/h' -e '/123/x' new
456inset
dfasdfsdf d 456
hello
-------------s-------------
dfasdfsdf d 456
123
456 new
hello
替换每行第n个匹配
[root@localhost hsyu]# sed 's/d/2/2' new
adbfs2f d 456
---------s----------
ad2
123 is good
ad2
替换所有匹配
[root@localhost hsyu]# sed 's/d/2/g' new
a2bfs2f 2 456
---------s----------
a22
123 is goo2
a22