taoCMS是基于php+sqlite/mysql的国内最小(100Kb左右)的功能完善的CMS管理系统

shell sed命令集锦

2012-05-31

看看一行脚本的一些例子。

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开头的单词的行。

 

/> 锚定单词的结束,如/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的行。

文章出处:飞诺网(www.firnow.com):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


类别:未分组 | 阅读:124665 | 评论:0 | 标签:shell sed

想收藏或者和大家分享这篇好文章→

“shell sed命令集锦”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

taoCMS发布taoCMS2.5Beta5(最后更新14年05月25日),请大家速速升级,欢迎大家试用和提出您宝贵的意见建议。

捐助与联系

☟请使用新浪微博联系我☟

☟在github上follow我☟

标签云