sed小技巧

来源:互联网 发布:为知 分享笔记 编辑:程序博客网 时间:2024/06/06 09:44

sed小例

 

sed 学习笔记(与大家共勉)
声明:这些代码只是为了学习和理解sed命令而为之,并不代表问题的唯一解或最佳解,希望各位拍砖
参考资料:<sed&awk.pdf>等
一. 替换1.神奇变换(y命令的使用) CODE: sed 'y/ori_letter_list/target_letter_list/' filename
CODE: cat filename
1234567890
2345678901
3456789012
4567890123 将文件中1换成A
将文件中2换成B 将文件中0换成J CODE: sed 'y/1234567890/ABCDEFGHIJ/' filename
ABCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC
注意变换关系是按两个list的位置对应变换,y是一个管局命令,拒绝使用后缀flag/g
list1:1234567890
list2:ABCDEFGHIJ
下面再作一个与前例相反的变换 CODE: sed 'y/0987654321/ABCDEFGHIJ/' filename
JIHGFEDCBA
IHGFEDCBAJ
HGFEDCBAJI
GFEDCBAJIH
2.替换每行第一个匹配
CODE: sed 's/regexpr/anyword/' filename
sed 's/regexpr/anyword/1' filename
举例: QUOTE: cat filename
1234567890 2345678901
3456789012 4567890123
sed 's/5/五/' filename
1234五67890 2345678901
34五6789012 4567890123
3.替换每行第n(如果有的话)个匹配 CODE: sed "s/regexpr/anyword/${n}" filename
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444 sed "s/4/ 四 /8" filename
111111111111111111
222222222222222222
333333333333333333
4444444 四 4444444444
4.替换每行所有匹配 CODE: cat filename
1234567890 2345678901
3456789012 4567890123
CODE: 举例:
sed 's/3/三/g' filename
12三4567890 2三45678901
三456789012 456789012三
二.行号处理1.为文件加行号 CODE: sed = filename|sed 'N;s//n/:/'
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
举例 CODE: sed = filename|sed 'N;s//n/:/' filename
1:111111111111111111
2:222222222222222222
3:333333333333333333
4:444444444444444444
2.仅为文件中的正文行加行号 CODE: sed /./= a|sed '/./N;s//n/:/'
举例 CODE: cat filename
111111111111111111 222222222222222222
333333333333333333 444444444444444444 sed /./= a|sed '/./N;s//n/:/' filename
1:111111111111111111 3:222222222222222222
4:333333333333333333 6:444444444444444444
三.字串翻转 CODE: sed '//n/!G;s//(./)/(.*/n/)/&/2/1/;//D;s/.//'
举例 CODE: echo 1234567890|sed '//n/!G;s//(./)/(.*/n/)/&/2/1/;//D;s/.//'
0987654321
四.选择性输出1.打印文档奇数行(隔行输出) CODE: sed 'n;d'
sed 'x;$!N;x'
sed -n 'p;n' 1
3
5
7
2.打印偶数行(隔行输出) CODE: sed -n 'n;p'
sed '1d;n;d;'
2
4
6
8
3.删除连续重复行(大量使用了pattern space 文件太大时要注意) CODE: sed '$!N; /^/(.*/)/n/1$/!P; D'    
#使用 $!N 要当心内存溢出
举例 CODE: cat file
111111111111111111
222222222222222222
222222222222222222
333333333333333333
444444444444444444
444444444444444444
444444444444444444
444444444444444444
444444444444444444 sed '$!N; /^/(.*/)/n/1$/!P; D' filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
4.合并上下行并以空格相分隔 CODE: sed '$!N;s//n/ /'
举例 CODE: cat file
1234567890
0987654321 1234567890 0987654321
5.将以/符号结尾的行与下行合并并以空格分隔(拼接断行) CODE: sed -e :a -e '///$/N; s////n/ /; ta'
举例 CODE: 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.按关键字拼接行
   如果某行以=开始,则合并到上一行并替代=为空格 CODE: sed -e :a -e '$!N;s//n=/ /;ta' -e 'P;D'
举例 CODE: cat file
111111111111111111
222222222222222222
=333333333333333333
444444444444444444 sed -e :a -e '$!N;s//n=/ /;ta' -e 'P;D' filename
111111111111111111
222222222222222222 333333333333333333
444444444444444444
7.输出匹配行的下一行
CODE: sed -n '/regexpr/{n;p;}' filename
举例 CODE: 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
举例 CODE: 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的行 CODE: sed '/^begin/,/^end/{/myword/d;}' filename
QUOTE: cat filename
myword
begin
myword
Number!
myword
Number!
myword
Number!
myword
Number!
end
myword
Number!
测试 QUOTE: myword
begin
Number!
Number!
Number!
Number!
end
myword
Number!
五.字串解析1.从字串中解析出两个子串(前2各字符和后9个字符) CODE: echo "WeLoveChinaUnix"|sed -e 'H;s//(../).*//1/;x;s/.*/(./{9/}/)$//1/;x;G;s//n/ /'
We ChinaUnix
2.分解日期串 CODE: echo 20030922|sed 's//(..../)/(../)/(../)//1 /2 /3/'|read year month day
echo $year $month $day
2003 09 22
原创粉丝点击