Shell学习笔记(14)-sed

来源:互联网 发布:回族最新人口数据 编辑:程序博客网 时间:2024/06/05 21:13
Script执行过程动态修改文件的做法,称为流编辑。具有流编辑能力的工具,称为流编辑器。sed是这方面的佼佼者,可补Bash的不足。另外,Script执行时可能要制作报表,呈现各字段信息。传统上,能和Bash完美搭配的,非awk莫属。
sed和awk相同的运行方式是:只要符合"样式"的数据行,就对它执行指定的"操作"

正则表达式
    (1) .代表任意的字符 例:\....表示符合"."后带三个任意字符的字符串
    (2) ^代表位置在行的开头 样式^Jack,代表Jack应出现在行首,才算符合样式
    (3) $代表位置在行的最后面 样式123$代表在行的最后面是123
    (4) [...]代表字符串行中的一个字符(长度为1个字符) 样式[ABc]代表A或B或c这三个字符中的一个
                                                       [^a-zA-Z0-9]一个非英文字母、且非数字的字符
    (5) *出现0个以上,代表前面的(左邻)字符有0个或0个以上 样式aA*c,代表A这个字符可能出现0个或0个以上
    (6) \{...\}指定符合的个数  [a-z]\{3,5\}代表以小写字母组成的字符串,长度是3~5。
    (7) \(...\)把比对符合的字符串暂时保存起来  H\(...\)y表示要保存H和y之间的3个字符
Sed的用法
    sed是一种非交互式的流编辑器,可动态编辑文件.所谓非交互式是说,sed和传统的文本编辑器不同,并非和使用者直接互动,sed处理的对象是文件的数据流(称为stream/流)。sed的工作模式是,比对每一数据行,若符合样式,就执行指定的操作.
    sed的语法如下: sed '样式命令' 文件
    注意:sed并不会更改文件内容。sed的工作方式是读取文件内容,经流编辑之后,把结果显示到标准输出。因此,如果想要存储sed的处理结果,得自行运用转向输出将结果存成其他文件。
    示例1:
    sed '1,4d' dataf1 把第1到第4行数据删除,剩下的显示出来。d是sed的删除命令.
    示例2:
    sed '/La/d' dataf3 把含有La的行删除,剩下的显示出来。其中,//代表搜索之意。
    示例3:
    sed '/[0-9]\{3\}/d' dataf3 把含有3位数的行删除,剩下的显示出来。
    示例4:
    sed '/^$/d' dataf5 删除dataf5的空白行。^表开头,$表尾部,这两者之间没有任何字符,代表该行是一空行。
    示例5:
    sed '/La/!d' dataf3 把不含有La的行删除,剩下的显示出来
    示例6:
    sed '/La/p' dataf3 把含有La的行显示出来。其中,p是sed的命令,它会把目前的数据显示出来,但因为sed默认含量也会显示不符合的数据行,所有,应改用如下指令:
    sed -n '/La/p' dataf3 选项-n会抑制sed显示出其他资料行的默认操作,只显示符合样式的数据行。
    示例7:
    sed -n 's/La/Oo/p' dataf3
    第一对//中含括的字符串(La)是搜索的目标,第二对//含括含括的是置换的字符串(Oo)。它会把数据行中的字符串La换成Oo.这里只会置换每行中的第一个,全部置换使用:
    sed -n 's/La/Oo/gp' dataf3
    示例8:
    sed -n 's/La//p' dataf3 把每一行第一个出现的La删除并显示出来
    示例9:把每一行的尾3个字符删除
    sed 's/...$//' dataf3
    示例10:取用符合样式的字符串
    sed -n 's/\(La\)/\1Oo/p' dataf3
    这个指令作用的结果:若数据行含有La字符串,则第一个出现的La会置换成LaOo,然后再显示这些含有La的数据行。
    示例11:
    sed -n '/AAA/s/234/567/p' dataf3
    找到含有AAA的那一行之后,将234换成567。
    示例12:
    sed -n '/AAA/,/DDD/s/B/567/p' dataf3
    将含有AAA到含有DDD的那几行,将其中的B换成567.
    示例13:
    sed -n '2,4s/B/567/p' dataf3
    由第2行到第4行,将其中的B换成567

综合实例: 更改文件中的内容并保存

#! /bin/bash

#修改vsftpd的配置文件,开放匿名FTP服务

VSFTPD_conf='/etc/vsftpd.conf'
TMP_file="/tmp/tmp.$$"

#将anonymous_enable选项,设成YES,这样,vsftpd就会开启匿名FTP登入的功能

sed s/^.*anonymous_enable=.*/anonymous_enable=YES/ $VSFTPD_conf > $TMP_file

mv -f $TMP_file $VSFTPD_conf

==========================================================
VSFTPD_conf存放待修改的配置文件。
TMP_file是临时文件,用来存储sed编辑后的结果.$$是Script的行程编号,利用$$组成临时文件名,这样,可以避免不同的Script开启重复的临时文件.
样式^.*anonymous_enable=.*表示开头含有0或n个字符,结尾含量有0或n个字符,中间包含anonymous_enable=的行
mv -f $TMP_file $VSFTPD_conf 表示用临时文件覆盖源文件