sed(Stream EDitor)是一款流编辑器,用来对文本进行过滤与替换操作。其原理是:通过文件或管道读取文件内容,但是sed默认并不直接修改源文件,而是一次仅读取文件的一行至模式空间(pattern space)根据sed指令进行编辑并输出结果后清除模式空间,即所有的操作都是在模式空间中进行的。
语法格式
sed [option]... 'script' inputfile...
OPTIONS
-n,--quite,--silent:静默输出,即不输出模式中的内容至输出 -e script:使用多个脚本指令执行编辑 -f /PATH/TO/SCRIPT_FILE:从指定的文件中读取编辑脚本 -r:支持在脚本中使用正则表达式 -i,--in-place:直接在文件原处执行编辑,即修改源文件
SCRIPT,地址+编辑指令
地址定界
(1) 不给地址:对全文进行处理; (2) 单地址 #:指定的行 $:文件的最后一行 /PATTERN/:被模式匹配到的每一行 (3) 地址范围 m,n:指定m行到n行 #,+n:指定#行到#+n行 /pat1/,/pat2/:匹配到的pat1到pat2之间的行 #,/pat/:第#行到匹配到pat (4) 步进:~ 注意:如果//中正则表达式为空,则匹配最近一次正则表达式的匹配地址!
编辑命令
d:删除 p:显示模式空间的内容 a [\]text:在行后面追加内容,支持使用\n(换行符)实现多行追加 i [\]text:在行前面插入内容,支持使用\n(换行符)实现多行追加 c [\]text:替换行为单行或多行文本,支持使用\n(换行符) w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定文件中 r /PATH/FROM/SOMEFILE:读取指定文件的文本流至模式空间中匹配到的行的行后 =:为模式空间中的行打印行号 !:取反条件 s/pattern/replacement/flags:替换,支持使用其他分隔符,如:s@@@, s### 替换标记(flags): #:替换行内匹配到的第#次的内容 g:行内全局替换 p:显示替换成功的行 w /PATH/TO/SOMEFILE:将替换后的结果保存至指定文件 replacement: &:用pattern匹配到的内容进行替换 \n:在pattern中使用\(\)指定时,匹配第n个子串
示例
1、删除/boot/grub/grub.conf文件中所有以空白开头的行行首的空白字符;
# sed 's/^[[:space:]]\+//' /boot/grub/grub.conf
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符;
# sed 's/^#[[:space:]]\+//' /etc/fstab
3、echo一个绝对路径给sed命令,取出其基名;进一步的,取出其目录名;
# echo "/tmp/test/fstab" | sed 's/[^/]\+\/\?$//'
基于sed脚本文件进行文本处理
用法
sed -f SCRIPT_FILE FILE
SCRIPT_FILE
address{ command1 command2 ... } 命令使用花括号进行组合,使命令序列作用于同一个地址。另外,第一个命令可以和左花括号在同一行,但右花括号必须单独处于一行。并且,命令后添加空格会产生错误。
sed的高级应用
除了存放当前输入行缓冲区的模式空间,sed还有一个保持空间(hold space)的缓冲区。模式空间的内容可以复制到保持空间,保持空间的内容也可以复制到模式空间。
高级编辑命令
h:把模式空间中的内容覆盖至保持空间 H:把模式空间中的内容追加至保持空间 g:从保持空间取出数据覆盖至模式空间 G:从保持空间取出数据追加至模式空间 x:把模式空间中的内容与保持空间中的内容进行互换 n:读取匹配到的行的下一行至模式空间 N:追加匹配到的行的下一行至模式空间 d:删除模式空间中的行 D:删除多行模式空间中的所有行
常用高级命令
sed -n 'n;p' FILE:显示偶数行 sed '1!G;h;$!d' FILE:逆向显示文件内容 sed '$!N;$!D' FILE: 取出文件后两行; sed '$!d' FILE:取出文件最后一行; sed 'G' FILE: sed '/^$/d;G' FILE: sed 'n;d' FILE: 显示奇数行; sed -n '1!G;h;$p' FILE: 逆向显示文件中的每一行;
原创文章,作者:Jeason,如若转载,请注明出处:http://www.178linux.com/58292