声明: 这些代码只是为了学习和理解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
举例:
引用: |
sed 's/regexpr/anyword/' filename
sed 's/regexpr/anyword/1' filename
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.替换每行所有匹配
sed "s/regexpr/anyword/${n}" filename
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
举 例
sed "s/4/ 四 /8" filename
111111111111111111
222222222222222222
333333333333333333
4444444 四 4444444444
sed "s/regexpr/anyword/${n}" filename
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
举 例
sed "s/4/ 四 /8" filename
111111111111111111
222222222222222222
333333333333333333
4444444 四 4444444444
二.行号处理
sed = filename|sed 'N;s//n/:/'
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
举例
sed = filename|sed 'N;s//n/:/'
cat filename
111111111111111111
222222222222222222
333333333333333333
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;d'
sed 'x;$!N;x'
sed -n 'p;n'
1
3
5
7
3.删除连续重复行(大量使 用了pattern space 文件太大时要注意)
sed 'n;d'
sed 'x;$!N;x'
sed -n 'p;n'
1
3
5
7
举例
sed 'n;d'
sed 'x;$!N;x'
sed -n 'p;n'
1
3
5
7
4.合并上下行并以空格相分 隔
sed 'n;d'
sed 'x;$!N;x'
sed -n 'p;n'
1
3
5
7
举例
cat file
1234567890
0987654321
执行命令后
1234567890 0987654321
5.将以/符号结尾的行与下行合并并以空格分隔(拼接断行)
cat file
1234567890
0987654321
执行命令后
1234567890 0987654321
举例
代码: |
cat filename 1 111111111111111111/ 2 222222222222222222 3 333333333333333333/ 4 444444444444444444 sed -e :a -e '///$/N; sn/ /; 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!
测试
引用: |
cat filename
myword
begin
myword
Number!
myword
Number!
myword
Number!
myword
Number!
end
myword
Number!
五.字串解析
1.从字串中解析出两个子串(前2各字符和后9个字符)
cat filename
myword
begin
myword
Number!
myword
Number!
myword
Number!
myword
Number!
end
myword
Number!
2.分解日期串
echo 20030922|sed 's//(..../)/(../)/(../)//1 /2 /3/'|read year month day
echo $year $month $day
2003 09 22