sed简介

  1. sed命令

    sed [options] 'command' file(s) 
    sed [options] -f scriptfile file(s)

  2. 基本命令:

    a 在当前行后面加入一行文本。 
    c 用新的文本改变本行的文本。 
    d 从模板块(Pattern space)位置删除行。 
    i 在当前行上面插入文本。 
    l 列表不能打印字符的清单。 
    n 从另一个文件中读文本下一行,并附加在下一行 
    p 打印模板块的行。 
    q 退出Sed。 
    r file 从file中读行。 
    w file 写并追加模板块到file末尾。 
    ! 表示后面的命令对所有没有被选定的行发生作用。 
    y 表示把一个字符转换为另外的字符[^正则表达式] 
    = 打印当前行号码。 
    # 把注释扩展到下一个换行符以前。 
    s/re/string 用string替换正则表达式re。

  3. 元字符集:

    ^ 锚定行的开始,如:/^sed/匹配所有以sed开头的行
    $ 锚定行的结束,如:/sed$/匹配所有以sed结尾的行
    . 匹配一个非换行符的字符,如:/s.d/匹配s后接一个任意字符,然后是d
    * 匹配零或多个字符,如:/ *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次,如:/o\{5\}/匹配包含5个o的行
    x\{m,\} 重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行
    x\{m,n\}重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行  

  4. 实例: 
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
    a :在当前行后面加入一行文本。 
    追加命令:a命令
    $ sed '1a drink tea' example   #第一行后增加字符串
    $ sed '1,3a drink tea' example   #第一行到第三行每一行后增加字符串
    $ sed '/^test/a drink tea' example   #字符串被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。

注:a 插入的字符在当前行的下一行 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
c: 用新的文本改变本行的文本。 
替代:c命令

  • $ sed '1c Hi' example   #第一行替代为Hi
    $ sed '1,3c Hi' example   #第一行到第三行替代为Hi
    $ sed '/test/c Hi' example  #将含有test的行替代为Hi
  • +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
    d :从模板块(Pattern space)位置删除行。 
    删除:d命令

  • $ sed '2d' example  #删除example文件的第二行。
    $ sed '2,$d' example  #删除example文件的第二行到末尾所有行。
    $ sed '/^$/d' example  #删除example文件的空行。
    $ sed '/test/d' example  #删除example文件所有包含test的行。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
i :在当前行上面插入文本。 
插入:i命令

  • $ sed '1i drink tea' example   #第一行前增加字符串
    $ sed '1,3i drink tea' example   #第一行到第三行每一行前增加字符串
    $ sed '/^test/i drink tea' example   #字符串被追加到以test开头的行前面,sed要求命令a后面有一个反斜杠。

注:i 插入的字符在当前行的上一行

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
l 列表不能打印字符的清单。 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
n: 从另一个文件中读文本下一行,并附加在下一行 
读取下一行:n命令

  • sed '/test/{n;d}' example #删除test下面的一行

  • sed -n 'p;n' example #打印奇数行

  • sed -n 'n;p' example #打印偶数行
  • sed 'n;d' example #隔一行删除
  • sed 'n;n;d' example #隔两行删除

注:n命令为将下一行的内容提前读入,并且将之前读入的行(在模式空间中的行)输出到屏幕,然后后续的命令会应用到新读入的行上。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
p :打印模板块的行。 
打印:p命令

  • $ sed -n '1p' example  #打印example文件的第一行。
    $ sed -n '$p' example  #打印example文件的最后一行。
    $ sed -n '2,$p' example  #打印example文件的第二行到最后一行。
    $ sed -n '/test/p' example
    $ sed '/test/!d' example

注:通常 p 会与参数 sed -n 一起使用

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
q: 退出Sed。 
退出:q命令

  • $ sed '3q' example   #打印完第3行后退出。(head –n )
    $ sed '/test/q' example   #查询到第一个test退出。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
r file :从file中读行。 
从文件读入:r命令

  • $ sed '/test/r file' example   # file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
    $ sed –e '/test/r file' –e '/test/d' example  #添加后并删除包含test的行
    $ sed '$r file' example   #将file的内容放到example文件的最下面。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
w file: 写并追加模板块到file末尾。 
写入文件:w命令

  • $ sed -n '/test/w file' example
        #在example中所有包含test的行都被写入file里。
    $ sed -n 's/test/ok/g w file' example
        #将test替换成ok后写入file里。

    $ sed -n '/test/p' example > file   
       #也可以使用重定向写入功能

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
! :表示后面的命令对所有没有被选定的行发生作用。 
地址限定-非:!

  • $ sed '1!d' example  # 不删除第一行(保留第一行)
    $ sed '$!d' example  # 不删除最后一行
    $ sed '/test/!d' example  #保留匹配行

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
y :表示把一个字符转换为另外的字符[^正则表达式] 
转换命令:y命令 (y是一个管局命令,拒绝使用后缀/g)

  • $ sed 'y/abcde/ABCDE/' example   #把所有abcde转变为大写。
    $ sed 'y/1234567890/abcdefghij/' example file #处理多个参数

注: y参数的替换时一一对应,两个字符串必须等长

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
= 打印当前行号码。 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
# 把注释扩展到下一个换行符以前。 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
s/re/string :用string替换正则表达式re。 
替换:s命令

  • $ sed 's/test/mytest/' example   #每行第一个匹配的test被替换成mytest。
    $ sed 's/test/mytest/g' example   #在整行范围内把test替换为mytest。
    $ sed -n 's/^test/mytest/p' example   #如果某一行开头的test被替换成mytest,就打印它。

注:g 表示整个范围,没有g表示每一行的第一个

  • $ sed 's/^[ \t]*//' example 
    #删除每一行开头的空白(空格、TAB)
    $ sed 's/[ \t]*$//' example 
    #删除每一行最后的空格(空格、TAB)
    $ sed 's/^[ \t]*//;s/[ \t]*$//' example
    #删除每一行的开头和结尾的空格 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
多点编辑:e命令

  • $ sed -e '1,5d' -e 's/test/check/' example   #第一条命令删除1至5行,第二条命令用check替换test。
    $ sed -e 's/yes/no/' -e 's/static/dhcp/' example 

注:(-e)选项允许在同一行里执行多条命令

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
地址限定-限制行:逗号

  • sed -n '/test/,/check/p' example 
    #所有在test和check所确定的范围内的行都被打印。
  • sed -n '5,/^test/p' example 
    #打印从第五行开始到第一个以test开始的行之间的所有行。
  • sed '5,6 s/1/2/g' example #将5-6行的所有1替换为2

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
分隔符:不论什么字符,紧跟着s命令的都被认为是新的分隔符,默认分隔符为“/”。

  • $ sed 's#10#100#g' example  
    $ sed 's|10|100|g' example  
    $ sed 's:10:100:g' example  
    $ sed 's/\/bin/\/usr\/local\/bin/g'    #分隔符出现在样式内部时,需要进行转义

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
已匹配字符串标记:&

#正则表达式 \w\+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:
$ echo this is a test line | sed 's/\w\+/[&]/g' 
    [this] [is] [a] [test] [line] 

#所有以192.168.0.1开头的行都会被替换成它自已localhost: 
$ sed 's/^192.168.0.1/&localhost/' file 
    192.168.0.1localhost

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
子串匹配标记\1

$ echo aaa aaa| sed 's/aaa/BBB/1'  
#第一个aaa替换BBB
$ echo aaa bbb| sed 's/\(aaa\) \(bbb\)/\2 \1/' 
   #将aaa 与 bbb的位置互换
$ sed -n 's/\(love\)able/\1rs/p' example
   #love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。

注:标记需要用()括起来

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

地址限定-限制行:逗号 

$ sed -n '/test/,/check/p' example
 #所有在test和check所确定的范围内的行都被打印。
$ sed -n '5,/^test/p' example
 #打印从第五行开始到第一个以test开始的行之间的所有行。
$ sed '5,6 s/1/2/g' example   #将5-6行的所有1替换为2 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
操作地址匹配

  • $ sed –n ' 1~2p ' example #打印文件的奇数行
    $ sed –n ‘ 2~2p ’ example #打印文件的偶数行

number 指定输入文件的唯一行 
first~step 指定以first开始,并指定操作步长为step,如1、2指定第一行、第三行、第五行……为操作地址。2~5指定第二行开始,每5行匹配一次操作地址

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
当你需要执行多个指令时,可以使用以下三种方法:

  • $ sed 's/yes/no/ ; s/static/dhcp/' example  
        #使用分号隔开指令
    $ sed -e 's/yes/no/' -e ' s/static/dhcp/' example
        #使用 -e 选项
    $ sed ' 
    > s/yes/no/
    > s/static/dhcp/' example #利用分行
  • 然而在命令行输入过长的指令是愚蠢的,这时需要-f选项指定sed脚本文件,在脚本文件中可以包含多行指令,而且也便于修改。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
5.脚本:

Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

范例1:将文本中的第二个"<body>"替换为"</body>"

$ cat test.txt
 <body>hello world<body>

$ cat sed.sh
 /body/{
s//\/body/2
}

$ sed -f sed.sh test.txt
<body>hello world</body>

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

范例2:给所有第一个的h1,h2等添加<>,第二个h1,h2添加</>


 $ cat test.txt
 h1Helloh1
 h2Helloh2

$ cat sed.sh
 /h[0-9]/{
s//\<&\>/1
s//\<\/&\>/2
}

$ sed -f sed.sh test.txt
<h1>Hello</h1>
<h2>Hello</h2>

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

范例3:删除行中的空白行
$ cat test.txt
 Hello 1

 Hello 2

$ cat sed.sh
     /.*/{
    /^$/d
}

$ sed -f sed.sh test.txt
 Hello 1
 Hello 2

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

范例4:大小写转换

$ cat test.txt
 hello 1
 hello 2

$ cat sed.sh
 /.*/{
y/hello/HELLO/
}

$ sed -f sed.sh test.txt
 HELLO 1
 HELLO 2

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
6. sed高级应用 
多行操作 Next 
Next(N)指令通过读取新的输入行,并将它追加至模式空间的现有内容之后,来创建多行模式空间。模式空间的最初内容与新的输入行之间用换行符分隔。在模式空间中插入的换行符可以使用\n匹配。

注:与n命令不一样的地方是N命令并没有直接输出当前模式空间中的行,而是把下一行追加到当前模式空间,两行之间用回车符\n连接 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
范例1

$ cat test.txt
 111
 222
 222
 222
 333

$ cat sed.sh
  #n
 /222/{
 N
 l
 }

$ sed –f sed.sh test.txt
 222\n222$
 222\n333$

注:读取样本文件内容至模式空间,当读取的内容与222匹配时,立刻读取下一行内容,再输出模式空间中的内容,小写的l会打印非打印字符

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
范例2

$ cat test.txt
 Name:Tom,
 Mail:Tom@gmail.com,
 Name:Jerry,
 Mail:Jerry@gamil.com,

$ cat sed.sh
  #n
 /Name/{
 N
 L
 }
L 打印(不显示非打印字符)

$ sed –f sed.sh test.txt
 Name:Tom,Mail:Tom@gmail.com,
 Name:Jerry,Mail:Jerry@gamil.com,

注:读取样本文件内容至模式空间,当读取的内容与Name匹配时,立刻读取下一行内容,再输出模式空间中的内容,#n 用来屏蔽自动输出

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

7.GUN sed拓展

1)大小写切换:
\U    # 小写 -> 大写
\u    # 头母小写 -> 大写
\L    # 大写 -> 小写
\l    # 头母大写 -> 小写

$ echo 'abc' | sed 's/.*/\U&/'
   ABC
$ echo 'abc' | sed 's/.*/\u&/'  
    Abc
$ echo 'ABC' | sed 's/.*/\L&/'
    abc
$ echo 'ABC' | sed 's/.*/\l&/'
    aBC

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

2)/REGEXP/I     正则匹配忽略大小写

$ echo 'AbC' | sed -n '/abc/Ip'
    AbC

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3) FIRST~STEP   取出奇数行或者偶数行

$ seq 10 | sed '0~2d'
    1
    3
   5
    7
    9


$ seq 10 | sed '1~2d'
    2
    4
    6
    8
    10

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

4)每5行合并成1行,类似 xargs -n5

$ seq 20 | xargs -n5
   1 2 3 4 5
   6 7 8 9 10
   11 12 13 14 15
   16 17 18 19 20

$ seq 20 | sed ':a;N;s/\n/ /;0~5b;ba'
    1 2 3 4 5
    6 7 8 9 10
     11 12 13 14 15
    16 17 18 19 20

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 5)\%REGEXP%
进行路径匹配时,使用此方法,可以剩去很多转义符\

$ echo 'a/b/c/d' | sed -n '/a\/b\/c\/d/p'
    a/b/c/d

$ echo 'a/b/c/d' | sed -n '\%a/b/c/d%p'
    a/b/c/d

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 6)ADDR1,+N
地址 +行数,可以实现类似 grep -A N 的功能。
$ seq 10 | grep -A2 '5'
    5
    6
    7

$ seq 10 | sed -n '/5/,+2p'
    5
    6
    7

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值