sed 命令

NAME
    sed - stream editor for filtering and transforming text

SYNOPSIS
    sed [OPTION]... {script-only-if-no-other-script} [input-file]...
参数:

      a 在当前行下面插入文本。
      i 在当前行上面插入文本。
      c 把选定的行改为新的文本。
      d 删除,删除选择的行。
      D 删除模板块的第一行。
      s 替换指定字符。
      h 拷贝模板块的内容到内存中的缓冲区。
      H 追加模板块的内容到内存中的缓冲区。
      g 获得内存缓冲区的内容,并替代当前模板块中的文本。
      G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
      l 列表不能打印字符的清单。
      n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
      N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
      p 打印模板块的行。
      P(大写) 打印模板块的第一行。
      q 退出Sed。
      b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
      r file 从file中读行。
      t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
      T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
      w file 写并追加模板块到file末尾。
      W file 写并追加模板块的第一行到file末尾。
      ! 表示后面的命令对所有没有被选定的行发生作用。
      = 打印当前行号码。
      # 把注释扩展到下一个换行符以前。

sed 替换标记

    g 表示行内全面替换。
    p 表示打印行。
    w 表示把行写入一个文件。
    x 表示互换模板块中的文本和缓冲区中的文本。
    y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)。
    1 子串匹配标记。
    & 已匹配字符串标记。

sed元字符集

   ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
   $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
   . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
   * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
   [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
   [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
   (..) 匹配子串,保存匹配的字符,如s/(love)able/1rs,loveable被替换成lovers。
   & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
   < 匹配单词的开始,如:/<love/匹配包含以love开头的单词的行。
   > 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
   x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行。
   x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
   x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。

示例:

替换操作

sed 's/root/rooot/'  passwd  //单条替换

sed 's/root/rooot/N'  passwd  //替换第N个

sed 's/root/rooot/g'  passwd  //全部替换

sed 's/root/rooot/Ng'  passwd  //从第N个开始替换

sed -n 's/root/rooot/p'  passwd  //仅打印替换成功的行

sed '2c hello,world' passwd //替换第二行

sed '1,2c hello,world' passwd //替换1-2行为新文本

sed '/rooot/{s/root/12345/}' passwd //匹配到rooot的行将root替换成12345

sed -i  's/root/rooot/'  passwd  //将更改应用于文件

删除操作

sed '/^$/d' passwd //删除空行

sed '2d'  passwd //删除第2行

sed '2,$d' passwd //删除2至末尾所有行

sed '$d' passwd  //删除最后一行

sed '/^root/d' passwd //删除所有root开头的行

已匹配字符标记&

sed 's/root/[&]/g'  passwd

子串匹配标记1

echo aaa BBB | sed 's/([a-z]+) ([A-Z]+)/2 1/'

多个表达式组合

sed '表达式' | sed '表达式'
等价于:
sed '表达式; 表达式'

引用

test=hello
echo hello WORLD | sed "s/$test/HELLO/"

选定行的范围:,

sed -n '/root/,/lp/p'  passwd   //打印匹配root至lp范围内的所有行

sed -n '2,/^bin/p'  passwd //打印第二行开始以bin开头的所有行

sed '/^bin/,/lp/s/$/aaa bbb/' passwd  //替换匹配以bin开头至lp范围的所有结束符为aaa bbb

多点编辑:e

sed -e '3d' -e 's/rooot/12345/' passwd  //执行多个sed命令

从文件读入:r

sed  '/^bin/r passwd01'  passwd //匹配以bin开头的行后面显示passwd01内容

写入文件:w

sed -n '/^bin/w passwd02' passwd //匹配以bin开头的行写入到passwd02文件中

追加:a

插入(行的上面):i 

sed  '1ihello,world' passwd //在第一行上面插入

下一个: n

sed '/root/{ n; s/bin/123/; }' passwd //如果root被匹配则移动到下一行替换bin为123

打印匹配字符串的下一行

sed -n '/^bin/{n;p}'  passwd

变形:y

sed '1,3y/bin/BIN/' passwd //将1到3行所有的b i n替换成B I  N

退出:q

sed '1q' passwd //打印到第一行退出sed

保持和获取:h命令和G命令

sed -e '/^bin/h' -e '$G'  passwd //将匹配到的以bin开头的行在最后一行输出,$ 结束位

保持和互换:h命令和x命令

sed -e '/root/h' -e '/lp/x' passwd //使用包含root的行替换包含lp的行

打印奇数行和偶数行

sed -n 'p;n' test.txt #奇数行
sed -n 'n;p' test.txt #偶数行

sed -n '1~2p' test.txt #奇数行
sed -n '2~2p' test.txt #偶数行

原文地址:https://www.cnblogs.com/imcati/p/11657635.html