文本处理Sed!!!

sed是一个行编辑器,用于修改文件内容

功能:用于处理编辑一个或多个文件

官网:http://www.gnu.org/software/sed/manual/sed.html

默认情况下,sed每读入一行会自动的把读入模式空间的数据打印出来,处理完成后,会接着自动读入下一行,开始下一轮循环,如果后面没有‘D’这种的特殊指令,会在两个循环之间清空模式空间,意思就是在读入下一行的时候会清掉上一行,如果有'D'这样的指令,就不会清空前面的那一行数据了,默认情况下不会修改文件内容,除非加入一些指令


用法:

    sed [option]...'script(意味着sed命令自带的语言)' inputfile(要处理的文件,可以写多个)...

script的格式:

    由'地址命令'组成,地址代表的就是要处理的文件中的某些行,而命令代表的sed中的一些指令


常用选项:

    -n:不输出模式空间内容到屏幕,也就是不自动打印

    -e:多点编辑

    -f:/PATH/script_file:从指定文件中读取编辑脚本

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

    -i.bak:加一个后缀的话会先做一个备份文件之后开始编辑文件

   (例子:sed -i.bak '7a alias cdnet="cd /etc/sysconfig/network-scripts"' ~/.bashrc先将~/.bashrc文件备份为~/.bash.bak文件然后在~/.bashrc的第7行下面添加一个别名)


地址定界:

(1)不给地址:对全文进行处理

(2)单地址:

    #:直接给个行号,可以直接显示某一行(例子:sed -n '2p' /etc/issue 只打印/etc/issue的第二行,p是打印的意思)

    $:代表最后一行(例子:sed -n '$p' /etc/fstab,仅打印最后一行)

    模式:两个//之间,可以写正则表达式,(例子:sed -n '/^U/p' /etc/fstab,仅将U开头的行打印出来,p是打印的意思)

(3)地址范围:

    #,#:行的范围,从第几行到第几行(例子:sed -n '9,12p' /etc/fstab,仅打印文件中第9行到第12行之间的数据)

    #,+#:第几行到这一行之后的多少行(例子:sed -n '9,+3p' /etc/fstab.仅打印文件中第9行到第9行之后的数据,也就是9到9+3之间的行)

  /part1/,/part2/:两个模式之间的行(例子:sed -n '/^b/,/^l/p' /etc/passwd仅显示b开头到l开头的行);

  但要注意,如果匹配到结束位置之后下面如果还有符合第一个模式的值,就还会继续显示,接着会寻找第二个模式相匹配的行,如果没有就会全部显示

    #,/part1/:表示从第几行到模式(例子:sed -n '3,/^f/p',仅打印从第三行到以f开头的行,模式与#反过来写也可以,比如说:

sed -n '/^f/,20p',仅打印以f开头的行到第20行之间的数据)

(4)~步进:(就是从开始位置递增每次递增几行,一直到结束)

    1~2奇数行,1-3-5-7-9...

    (例子:sed -n '1~2p' /etc/passwd,仅打印从第一行开始每次递增两行也就是第一行,然后第一行+2=3,第三行+2等于5,以此类推一直到结束)

    2~2偶数行,2-4-6-8-10....

    (例子:sed -n '2~2' /etc/passwd,仅打印从第二行开始每次递增两行也就是第二行,然后第二行+2=4,第四行+2等于6,以此类推一直到结束)


编辑命令:

   p:满足前面地址定界就打印

   d:删除模式空间匹配的行,默认情况下会将每一行读取到模式空间里,并开始下一轮循环,就读入新的一行

    (例子:cat -n /etc/passwd | sed '20,30d' 显示删除20-30之后的行,因为sed会自动打印模式空间的数据,如果加上-n就会全部都不显示)

   a[\]text:如果地址满足条件则在地址匹配的行的下面追加文本,直接在a后面输入要追加的数据可以,也可以在a前面输入一个\意思就是\后面的文本都是要追加的文本,适用于要追加空格,如果要添加多行,需要换行的话,在要换行的位置输入\n即可

   i[\]text:如果地址满足条件则在地址匹配的行的上面追加文本,直接在i后面输入要追加的数据可以,也可以在i前面输入一个\,意思就是\后面的文本都是要追加的文本,适用于要追加空格,如果要添加多行,需要换行的话,在要换行的位置输入\n即可

   c[\]text:替换前面地址满足的行

   w "路径文件":将符合模式的行存到一个新的文件中(例子:sed '/^alias/w/app/f1.txt' ~/.bashrc,将~/.bashrc文件中以alias开头的行存到/app/f1.txt文件中并且打印在屏幕)

   r "路径文件":读取路径文件中的数据到符合地址对应的文件后面(例子:sed '/^alias/r/etc/centos-release' ~/.bashrc,将/etc/centos-release中的数据读取到~/.bashrc的以alias开头的行下面)

   =:显示符合条件的行的行号(例子:sed '/^alias/=' ~/.bashrc,显示~/.bashrc中以alias开头的行的行号)

   !:取反(例子:sed -n '/^alias/!p' ~/.bashrc 除了以alias开头的行其他的行都打印)


非常实用的技术!!!(敲黑板,必会!)

s///:搜索替代,支持使用其他分隔符,s@@@,s###...如果默认这样写,只替代这一行里找到的第一个字符串

替换标记:

    g:将全部匹配的全部替换

    p:显示替换成功的行

    w:跟上面含义一样的

例子:

sed 's#/bin/bash$#/sbin/nologin#' /etc/passwd,将/etc/passwd文件中所有以/bin/bash结尾的行替换为以/sbin/nologin结尾

sed -r 's#(/bin/bash$)#------\1=====#' /etc/passwd,/etc/passwd文件中在/bin/bash的前面和后面加上---和===字符