sed学习笔记

sed学习笔记
声明:这些代码只是为了学习和理解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 2345678901

  34五6789012 4567890123

  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/;s/.//'

  举例

  代码:

  echo 1234567890|sed '///n/!G;s///(.//)//(.*//n//)/&//2//1/;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

转自:http://doc.linuxpk.com/3871.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值