2018-09-22 sed 命令详解

lunixs三大基本文本处理工具:grep sed awk

字符处理用法均涉及正则表达式,我们先学习正则

REGEXP: regular expression

pattern:

正则表达式分为2类:

basic REGEXP:基本

Extended REGEXP:扩展

基本正则表达式:

扩展的正则表达式:

字符匹配:

·:任意单个字符

?:其前字符0次或1次

+:匹配其前字符至少1次

{m,n}:不用加反斜线,

分组:(),\1,\2,\3……

或者

a|b :or的意思

grep -e =egrep

fgrep:fast 快速搜索,不支持正则表达式

sed基本用法:

Stream Editor

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

sed每次把一行读取到模式空间,处理文本后输出到屏幕,sed对原文件不做任何处理,仅对模式空间中的文件做处理。

sed:模式空间

sed  'addressCommand'  file……

对这个文件中符合地址的行执行该命令

Address:

    1.StartLine,EndLine:1,100

    $:最后一行

    $-1:倒数第二行

    2./RegExp/ :/^root/

    3./pattern1/,/pattern2/ :第一次被模式1匹配到的行开始到第一次被模式2匹配到的行结束。

    4.LineNumber指定的行

    5.StartLine,+N:从startLine行开始,向后的N行,一共是N+1行。

command:

    d:删除符合条件的行

    p:显示符合条件的行(print)

    -n:静默模式     

不显示模式空间的内容,只显示命令相关内容

    a \string:在指定的行后面追加新行,内容为"string"

    i \string:在指定的内容前面添加新行,内容为string

    r  filename:将指定文件的内容添加至符合条件的行数,$r,用于合并文件。

    w:将地址指定的范围内的内容另存至指定文件中

    s/pattern/string/修饰符:查找并替换,将每一行中pattern替换成string,默认只替换每行第一次遇到的模式匹配到的string

        加修饰符

            g:全局替换

            i:忽略字符大小写

        s///:s###,s@@@

        l..e:

        &:引用模式匹配整个串

        也支持后向引用

        -i:直接修改原文件

        -e script  -e  script:可以同时执行多个脚本

        -f /PATH/TO/SED_SCRIPT:

        -r:表示使用扩展正则表达式

练习:将history中的空格删除

        history | sed ‘s#[[:space:]]##g'

习题:1.删除/etc/grub.conf文件中行首的空白符

sed  -r  's@^ [[:space:]]+@@g'  /etc/grub.conf

  -r:表示使用扩展正则表达式

  +:匹配其前字符至少1次

   g:全局替换

2.替换/etc/inittab文件中“id:3:initdefault:”一行中的数字为5;

sed  's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g'  /etc/inittab

    \(\) :分组

    \1:第一个左括号以及与之对应得右括号包含得所有内容

    \2:第二个左括号以及与之对应得右括号包含得所有内容

    [0-9]替换成5

3.删除/etc/inittab文件中的空白行;

    sed   '/^$/d'   etc/inittab

     d:删除符合条件的行

    ^$:空白行

4.删除/etc/inittab文件中开通的#号

    sed  's@^#@@g'   etc/inittab

    ^:锚定行首,这个字符后面得字符串必须出现在行首

5.删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;

    sed  -r  's@#[[:space:]]+@@g'   /etc/inittab

     -r:表示使用扩展正则表达式

      +:匹配其前字符至少1次

6.删除某文件中以空白字符后面跟#类的行中开头的空白字符及#

    sed -r  's@^[[:space:]]+#@@g'   /etc/inittab

7.取出一个文件路径的目录名称;???

    echo  "/etc.rc.d" | sed -r  's@^(/.*/)[^/]+/?@\1@'

你可能感兴趣的:(2018-09-22 sed 命令详解)