SED 常用

一. 替换

  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

猜你喜欢

转载自leowzy.iteye.com/blog/1453391
今日推荐