天天看点

Sed

Sed    Stream Editor    

      行编辑器(全屏编辑器:vi)

      逐行读取到模式空间,处理完之后输出   默认不修改源文件,

      仅对模式空间中的数据做处理,处理完之后将模式空间的内容追行打印

      sed 'Address Command' file...   ‘’ “” 都可以,如果有变量用弱引用

      Address

           1、StartLine,EndLine

               1,100

               $       最后一行

               $-1     倒数第二行

           2、/RegExp/

               /^root/ '/oot/d'

           3、/pattern1/,/pattern2/

               第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束

           4、LineNumber

               指定的行

           5、StartLine, +N

               从startLine开始,向后的N行

       Command

               -i  直接修改源文件

               -n  静默模式,不再显示模式空间中内容  

               -e  SCRIPT -e SCRIPT    可以同时执行多个脚本(COMMAND)

                   sed  --e '1,10d' -e 's/L\(..e\)r/l\1/g' /shell/1

               -f  用脚本处理/PATH/TO/SED_SCRIPT

                   vi /shell/script

                       2a\two numbers

                       4s/#/@/g

                       $i\end numbers

                   sed -f /shell/script /shell/1

               -r  适用扩展正则表达式

                   错误的写法   history  | sed -r 's/^[[:space:]]\(.*\)/\1/'

               d   删除行

                   sed '1d'    删除第一行

                   sed '3,$d' /tmp/inittab 删除第三行到最后一行

                   sed '1,+2d' /tmp/inittab    删除第一行到第三行

                   sed '/^\//d' /etc/fstab     删除以\开头的行

               p   显示匹配到的行

                   sed '/^\//p' /etc/fstab     匹配到的显示2次,因为sed默认会显示模式空间的行

                   sed -n '/^\//p' /etc/fstab

               a   \string 在匹配到的行后面,追加新行,内容为"string"   a后面加\利于实现特殊字符

                   sed  '/^\//a\# hello world \n#hello linux' /etc/fstab   在\开头行后加2行注释

                   sed  '/^\//a#hello\n#hello' /etc/fstab          a

               i   \string 在匹配到的行前面,追加新行,内容为"string"

               r   file    将制定文件内容添加至符合条件的行后

                   sed '2r /etc/inittab' /shell/1

                   sed '1,2r /etc/inittab' /shell/1    第一行后面添加一遍,第二行后面添加一遍

               w   将指定范围内的内容另存至指定的文件中,如果是已存在文件会覆盖其内容,如果不存在会建立文件并保存内容

                    sed  -n '/^#/w /shell/2' /etc/inittab

               s   /pattern/string/    查的并替换   默认开始只替换每行的第一个

                   sed '1,3s/#/$/' /shell/1

                   sed 's/^\//#/' 2                    替换以/开头的行为#

                   sed '1s/#/$/;3s/#/$/' /shell/1      替换第一行第三行第一个匹配到的

                   修饰符

               g   全部替换

                   sed '1s/#/$/g;3s/#/$/' /shell/1     替换第一行全部和第二行第一个匹配到的

                   i   匹配时忽略大小写

                    sed 's/inittab/haha/ig' /shell/1   替换全文inittab时忽略大小写,替换为haha

               s   /正则表达式/字符串(    支持引用,不支持正则)/ s$$$ s@@@ s%%%  这样不适用查找中带有的,平时适用/,这样查找/是就不用转义了

                   后向引用    \(\)    \1  \2

                   l..e    like --> liker  love -->lover 两种实现 \(\)   &

                       sed 's/\(l..e\)/\1r/' /shell/1

               &   引用模式匹配整个串

                       sed 's/l..e/&r/' /shell/1

                   只引用一部分的时候,后项引用可以细化第一个pattern,&则是全部匹配,

                       实现like --> Liker  love -->Lover

                       sed 's/l\(..e\)/L\1r/g' /shell/1

                   现实删除history前面的空白字符

                       history  | sed -r 's/^[[:space:]]*//g'

练习  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<code>1、删除</code><code>/etc/grub</code><code>.conf文件中行首的空白字符</code>

<code>    </code><code>sed</code> <code>'s/^[[:space:]]*//'</code> <code>/etc/grub</code><code>.conf</code>

<code>2、替换</code><code>/etc/inittab</code><code>文件中“</code><code>id</code><code>:5:initdefault:"一行中的数字为3;</code>

<code>    </code><code>sed</code> <code>'s/^\(id\):5:\(initdefault\)/\1:3:\2/'</code> <code>/etc/inittab</code>

<code>3、删除</code><code>/etc/inittab</code><code>文件中的空白行</code>

<code>    </code><code>sed</code> <code>'/^$/d'</code> <code>/etc/inittab</code>

<code>4、删除</code><code>/etc/inittab</code><code>文件中开头的</code><code>#号,但要求#号后面必须有空白字符</code>

<code>    </code><code>sed</code> <code>'s/^#\([[:space:]]\+\)/\1/'</code> <code>/shell/inittab</code>

<code>5、删除</code><code>/etc/inittab</code><code>文件中开头的</code><code>#号和空白字符,但要求#号后面必须有空白字符</code>

<code>    </code><code>ed -r </code><code>'s/^#[[:space:]]+//'</code> <code>/shell/inittab</code>

<code>    </code><code>sed</code>  <code>'s/^#\([[:space:]]\+\)//'</code> <code>/shell/inittab</code>

<code>6、取出一个文件路径的目录名称</code>

<code>    </code><code>echo</code> <code>"/shell/asdasd/inittab"</code> <code>| </code><code>sed</code> <code>'s/^\(.*\)\/.*$/\1/'</code>

<code>    </code><code>echo</code> <code>"/shell/haha/inittab"</code> <code>| </code><code>sed</code> <code>'s#^\(/.*\)/.*#\1#'</code>

<code>    </code><code>echo</code> <code>"/shell/haha/inittab/"</code> <code>| </code><code>sed</code> <code>-r </code><code>'s#^(/.*/)[^/]+/?#\1#'</code>

<code>7、取得路径基名</code>

<code>    </code><code>echo</code> <code>"/shell/haha/inittab/"</code> <code>| </code><code>sed</code> <code>-r </code><code>'s#^/.*/([^/]+)/?#\1#'</code>

<code>8、删除某文件中以空白字符后面跟</code><code>#类的行中的开头的空白字符及其#</code>

<code>    </code><code>sed</code> <code>'s/^[[:space:]]#\(.*\)/\1/'</code> <code>/shell/inittab</code>

本文转自 ftmoonfans  51CTO博客,原文链接:http://blog.51cto.com/soulboy/1259038

继续阅读