Linux sed命令详解

sed:
  一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响。
  处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),
  接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
  接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
  sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。


替换操作:
  查找替换,只会替换每行第一个匹配的内容
  

sed 's/old_str/new_str/' filename


  打印被替换的行, -n 和 -p 需要连用
  

sed -n 's/old_str/new_str/p' filename


  使用g表示会替换每一行中所有匹配的内容
  

sed 's/old_str/new_str/g' filename


  当需要从一行的某一个匹配开始替换时,使用ng
  

sed 's/old_str/new_str/ng' filename


  使用-i会直接替换文件中的内容,文件会被改变
  

sed -i 's/old_str/new_str/g' filename


  命令连用
  

sed -i 's/old_str/new_str/2g' filename


  把每一行第二个匹配的内容替换,并把修改后的结果保存到文件中
  

sed -i -n 's/old_str/new_str/2gp' filename


  把每一行第二个匹配并且替换后的内容提取出来,并保存到文件中,
  文件中只有被替换行的内容,没有被修改的行将删除


删除操作:
  删除空白行

sed '/^$/d' filename

  删除文件的第二行
  

sed '2d' filename


  删除第二行到末尾
  

sed '2,$d' filename


  删除末尾行
  

sed '$d' filename


  删除匹配的行
  

sed '/^my/d' filename


正则表达式匹配:
  使用w+匹配每一个单词,使用[&]替换他, &表示匹配到的单词

sed 's/w+/[&]/g' filename

  正则匹配到的第一个子串为1,以此类推

  echo this is digit 7 in a number | sed 's/digit ([0-9])/1/'
  this is 7 in a number
  echo aaa BBB | sed 's/([a-z]+) ([A-Z]+)/2 1/'
  BBB aaa


多表达式:
  sed '表达式' | sed '表达式'
  等价于 sed '表达式;表达式'
  等价于 sed -e '表达式' -e '表达式'


从文件读入:r命令
  会把文件中的内容显示在匹配行的后面,如果匹配了多行,显示多次
  

sed '/my/r test.txt' filename


写入文件:w命令
  会把匹配到的行写入文件中
  

sed -n '/my/w test.txt' filename

追加(行下):a命令
  

sed '/^my/a	his is a test line' filename


  在第二行之后追加
  

sed '2a	his is a test line' filename


插入(行上):i命令
  

sed '/^my/i	his is a test line' filename


下一个:n命令
  如果my被匹配,则移动到匹配行的下一行,替换这一行this为Tis,并打印
  

sed '/my/{n; s/this/This/;}' filename


变形:y命令
  把1到10所有的abcde变成大些ABCDE,正则表达式不能使用这个命令
  

sed '1,10y/abcde/ABCDE/' filename

  不加1,10表示匹配所有

退出:q命令
  打印到第三行退出
  

sed '3q' filename


打印奇数行:

  sed -n 'p;n' filename

打印偶数行:

  sed -n 'n;p' filename