本章主要介绍sed的命令使用

sed(Stream Editor)是一种流编辑器,或者叫做行编辑器,以行为单位进行编辑处理,而后续会介绍的vi编辑器是一种全屏编辑器。

sed的工作原理:

    逐行读取文件中的每一行,并将其放在内存空间中,在对内存空间中的数据进行处理,将处理后的结果打印到屏幕上。而这种内存空间也叫做模式空间。

所谓模式空间:就是将放在内存空间的数据根据模式来匹配,匹配成功的数据进行相应的编辑处理,将处理后的数据打印到屏幕上去

说明:sed命令默认将文件中所有的行打印到屏幕上去。

sed命令默认不会修改源文件内容,只是产生显示的效果。


sed命令的使用用法:

sed [option] 'AddressCommand' [FILE...]

常见option:

    -n:禁止默认输出,即静默模式输出,sed命令默认会将文件中所有的行打印出来,加上-n表示只有符合模式匹配的行才打印到屏幕上显示出来。通常需要和"Command中的p"一起联合使用。

-i:直接修改原文件

-e SCRIPT1 -e SCRIPT2..:可以同时执行多个脚本(这里的脚本指的是'AddressCommand')

wKioL1OdkGWRXdQ9AAIDGrVczUA203.jpg

-f /path/to/sed_script:这是个脚本文件是存放sed的脚本命令的,每一行都是一个脚本,这个命令的作用就是将脚本文件中的每一条命令加载到命令行来执行,进而对指定文件中符合模式的行编辑处理。其实这个选项和-e实现的功能是一样的,只不过这中方式是将-e选项后面的多个脚本全部放在一个文件中去了,然后这个文件中的脚本在一一对特定文件进行处理。

    使用方法形如:sed -f /path/to/sed_script FILE

wKiom1Odj-mgjJGhAAKxJ1la6Fc558.jpg

-r:表示支持扩展正则表达式


Address:原来寻找文件中符合条件的行

地址的定界有一下5种方式:

1、指定StartLine,EndLine

例如:第1到第100行   这样表示:1,100


2、/ReGExp/ :使用模式中的正则表达式来定位

例如:找到以root字符串开始的行,可以这样表示:/^root/


3、/pattern1/,/pattern2/

匹配的是:从pattern1第一次匹配的行开始,到pattern2第一次匹配的行结束,这中间所有的行。

如:# sed -n  '/^title/,+3p' /boot/grub/grub.conf

 


4、LineNumber:指定的第几行


5、StartLine,+n:匹配从第StartLine行起,向后的N行,共匹配N+1行

wKiom1Odk7HzZYt4AACToBtALhw980.jpg


Command:

    d:删除指定的行

    p:显示符合条件的行

    $:表示最后一行

    n:表示将下一行读到模式空间中,并使用下一个命令来处理。因此,处理的是第2行。

        例如:将484所在行的下一行中的483改为10000.

        wKiom1bIFe2zU-LaAAA7jO3fXXQ331.png

    N:表示将下一行附加在当前模式空间中行的后面,由于当前行后面带有"\n",因此默认输出显示的还会是2行。因此,处理的是第一行。

     例如:表示将文件中的第2行和第3行合并

     wKioL1bIF52gDwkwAAA4Zv-vjzA351.png

    !:表示匹配除了该符号前面所在行的所有行。$!表示出了最后一行的所有行。

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

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

    wKioL1OdluuhzDEKAAG5DL-dKL0994.jpg

    r:将指定的文件添加到符合条件行后面

wKiom1OdmQLgvt-mAAGqm7QKdVU930.jpg

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

    s/pattern/string/修饰符:字符串的替换;注意:string是不可以使用元字符的,因为他不是模式

    默认不加修饰符表示只替换每一行中第一次匹配到的字符串

        g:表示全局替换

    说明:替换符不仅仅只限于/来表示,#,@等都可以原来表示替换符

wKioL1OdmqazvaraAAPtLbZg3ik889.jpg

        &:只能引用模式匹配的整个字符串。

        wKioL1Xg-YTh7w_NAACbKiSV5As164.jpg

        在这个例子中,&用来引用整个模式中的字符串。即引用6.4这个字符串。

        后向引用:可以引用自己想要引用的字符串,可以是全部,也可以是部分。例如:

      wKioL1Xg-8myHpEwAAPK61SylqE346.jpg      

此处的\1就是引用第一个左括号到最后一个右括号里的内容。