您的位置:首页 > 其它

sed 学习笔记

2010-03-30 12:15 176 查看
声明:
这些代码只是为了学习和理解sed命令而为之,并不
代表问题的唯一解或最佳解,希望各位拍砖

参考资
料:<sed&awk.pdf>等

一. 替换

1.神奇变换(y
命令的使
用)

代码:

sed 'y/ori_letter_list/target_letter_list/' filename
代码:

cat filename

1234567890

2345678901

3456789012

4567890123
测试


文件中1
换成A

将文件中2
换成B

...

将文件中0
换成J

代码:

sed 'y/1234567890/ABCDEFGHIJ/' filename

ABCDEFGHIJ

BCDEFGHIJA

CDEFGHIJAB

DEFGHIJABC
注意变换关系是按两个list的位置对应变换,y是一个管局命令,拒绝使用后缀flag/g

list1:1234567890

list2:ABCDEFGHIJ


面再作一个与前例相反的变换

代码:

sed 'y/0987654321/ABCDEFGHIJ/' filename

JIHGFEDCBA

IHGFEDCBAJ

HGFEDCBAJI

GFEDCBAJIH
2.替换每行第一个匹配

代码:

sed 's/regexpr/anyword/' filename

sed
's/regexpr/anyword/1' filename
举例:

引用:

cat filename

1234567890 2345678901

3456789012
4567890123

sed 's/5/五/' filename

1234五67890 2345
678901

34五6789012 45
67890123
3.替换每行第n(如果有的
话)个匹配

代码:

sed "s/regexpr/anyword/${n}" filename

cat filename

111111111111111111

222222222222222222

333333333333333333

444444444444444444




sed "s/4/ 四 /8" filename

111111111111111111

222222222222222222

333333333333333333

4444444 四 4444444444
4.替换每行所有匹配

代码:

cat filename

1234567890 2345678901

3456789012
4567890123
代码:

举例:

sed 's/3/三/g' filename

12三4567890
2三45678901

三456789012 456789012三
二.行号处理

1.
为文件加行号

代码:

sed = filename|sed 'N;s//n/:/'

cat filename

111111111111111111

222222222222222222

333333333333333333

444444444444444444
举例

代码:

sed = filename|sed 'N;s//n/:/' filename

1:111111111111111111

2:222222222222222222

3:333333333333333333

4:444444444444444444
2.仅为文件中的正文行加行


代码:

sed /./= a|sed '/./N;s//n/:/'
举例

代码:

cat filename

111111111111111111

222222222222222222

333333333333333333

444444444444444444

sed /./=
a|sed '/./N;s//n/:/' filename

1:111111111111111111

3:222222222222222222

4:333333333333333333

6:444444444444444444
三.字串翻转

代码:

sed '//n/!G;s//(./)/(.*/n/)/&/2/1/;//D;s/.//'
举例

代码:

echo 1234567890|sed
'//n/!G;s//(./)/(.*/n/)/&/2/1/;//D;s/.//'

0987654321
四.选择性输出

1.打印文档奇数行(隔行输出)

代码:

sed 'n;d'

sed 'x;$!N;x'

sed -n 'p;n'

1

3

5

7
2.打印偶数行(隔行输出)

代码:

sed -n 'n;p'

sed '1d;n;d;'

2

4

6

8
3.删除连续重复行(大量使
用了pattern space 文件太大时要注意)

代码:

sed '$!N; /^/(.*/)/n/1$/!P; D'

#使用 $!N 要当心内存溢出
举例

代码:

cat file

111111111111111111

222222222222222222

222222222222222222

333333333333333333

444444444444444444

444444444444444444

444444444444444444

444444444444444444

444444444444444444

sed '$!N;
/^/(.*/)/n/1$/!P; D' filename

111111111111111111

222222222222222222

333333333333333333

444444444444444444
4.合并上下行并以空格相分


代码:

sed '$!N;s//n/ /'
举例

代码:

cat file

1234567890

0987654321

执行命令后

1234567890
0987654321
5.将以/符号结尾的行与下行合并并以空格分隔(拼接断行)

代码:

sed -e :a -e '///$/N; s////n/ /; ta'
举例

代码:

cat filename

1 111111111111111111/

2
222222222222222222

3 333333333333333333/

4 444444444444444444

sed
-e :a -e '///$/N; s////n/ /; ta' filename

1 111111111111111111 2
222222222222222222

3 333333333333333333 4 444444444444444444
6.按关键字拼接行

如果某行以=开始,则合并到上一行并替代=为空格

代码:

sed -e :a -e '$!N;s//n=/ /;ta' -e 'P;D'
举例

代码:

cat file

111111111111111111

222222222222222222

=333333333333333333

444444444444444444

sed -e :a -e '$!N;s//n=/ /;ta' -e 'P;D'
filename

111111111111111111

222222222222222222
333333333333333333

444444444444444444
7.输出匹配行的下一行

代码:

sed -n '/regexpr/{n;p;}' filename
举例

代码:

cat filename

1 111111111111111111

2
222222222222222222

3 333333333333333333

4 444444444444444444

sed
-n '/^3/{n;p;}' filename

4 444444444444444444
8.显示匹配行的行号并输出
匹配行的上行、匹配行、下行

sed -n -e '/regexpr/{=;x;1!p;g;$!N;p;D;}'
-e h

举例

代码:

cat filename

1 111111111111111111

2
222222222222222222

3 333333333333333333

4 444444444444444444

sed
-n -e '/^3/{=;x;1!p;g;$!N;p;D;}' -e h filename

3
#匹配行的行号

2 222222222222222222 #上一行

3
333333333333333333 #匹配行

4 444444444444444444 #下一行
9.删除文档中某标志区域内
的关键字匹配行

删除文档中从being开到end结束的块中包含myword的行

代码:

sed '/^begin/,/^end/{/myword/d;}' filename
引用:

cat filename

myword

begin

myword

Number!

myword

Number!

myword

Number!

myword

Number!

end

myword

Number!
测试

引用:

myword

begin

Number!

Number!

Number!

Number!

end

myword

Number!
五.字串解析

1.从字串中解析出两个子串(前2各字符和后9个字符)

代码:

echo "WeLoveChinaUnix"|sed -e
'H;s//(../).*//1/;x;s/.*/(./{9/}/)$//1/;x;G;s//n/ /'

We ChinaUnix
2.分解日期串

代码:

echo 20030922|sed 's//(..../)/(../)/(../)//1 /2
/3/'|read year month day

echo $year $month $day

2003 09 22
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: