sed工具:sed是文本流编辑器,逐行对文件的内容进行处理
用法:sed [option] ... 'script' inputfile...
选项:
-n:静默模式,不输出模式空间的内容至屏幕
-e:实现多点的功能编辑
-f /path/from/script_file:从指定的文件读取编辑脚本
-r:支持使用扩展的正则表达式
地址界面方法:
(1)不给地址:对全文进行处理
(2)一个地址(单地址)
#:指定的行
/pattern/:被引用处模式所能够匹配到的每一行:
(3)地址范围
#,#:从第几行到第几行
#,+#:显示从第几行开始向后的N行
/pat1/,/pat2/:同时匹配2个参数,表示匹配这2个参数之间的所有行
#,/pat1/:表示匹配这2个参数之间的所有行
(4)~:步进
#sed -n ‘1~2p’ test.txt(第一行开始,每次增加2行,意思就是显示奇数行)
#sed -n ‘2~2p’ test.txt(从第二行开始显示,每次增加2行,意思就是显示偶数行)
编辑命令:
d:删除被地址界定选定的内容
p:显示(打印)模式空间中的内容到屏幕上,只打印符合条件的行,常于-n结合一起使用
a \text:在行后面一行追加文本:支持使用\n实现多行追加;
例: #sed '/^T/a \abc' a.txt
i \text:在行前面一行追加文本:支持使用\n实现多行追加;
例:# sed '/^T/i \abc' a.txt
c \text:替换匹配到的行:
例:# sed '/^T/c \abc' a.txt
w /path/to/somefile:保存模式空间中匹配到的内容至指定文件中;
r /path/from/somefile:读取指定文件的文本游戏 至模式空间中匹配到的行后;
=:为模式空间中的行,打印行号;
例:#sed -n '/^T/=' a.txt
q:一旦匹配到内容,则退出;不再往下匹配
!:取反条件;对除了模式匹配到的行以外的行,进行操作;
s///:支持使用其它分隔符,s@@@,s###
替换标记:
#:行内替换,替换第几次出现的匹配的内容,例:sed -n 's/Unix/UNIX/2p' a.txt,把第2次出现的Unix替换
p:如果替换成功,则显示替换成功的行,与-n一起使用
w /path/to/somefile:将替换成功的行保存至指定文件中
练习1:删除/boot/grub/grub.conf文件中所有以空白开头的行行首的空白字符
#sed 's@^[[:space:]]\+@@' /boot/grub/grub.conf
练习2:删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
#sed 's@^#[[:space:]]\+@@' /etc/fstab
练习3:echo一个绝对路径给sed命令,取出其基名:
#echo "/etc/sysconfig" | sed 's@[^/]\+$@@'
练习4:批量修改文件名字
#ls *.jpg | sed 's#\(.*\)_finished\(.*\).*#mv & \1\2#g' | bash
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间的内容追加至保持空间中;
g:从保持空间取出数据覆盖至模式空间;
G:从保持空间取出数据追加至模式空间;
x:把模式空间中内容与保持空间中的内容进行互换操作;
n:读取匹配到的行的下一行覆盖至模式空间;
N:读取匹配到的行的下一行追加至模式空间;
d:删除模式空间中的所有行;
D:删除多行模式空间中的第一行;
示例用法:
#sed -n ‘n;p’ test.txt(输出偶数行)
#sed ‘n;d’ test.txt(只显示奇数行)
#sed ‘$!d’ test.txt(最出文件最后一行)
#sed ‘G’ test.txt(在每一行下面加一个空白行)
#sed ‘/^$/d;G’ test.txt(每行间只保留一个空白行)
#sed '1!G;h;$!d' test.txt(逆行显示文件内容)
#sed ‘$!N;$!D’ test.txt(读文件的后2行)
#sed -n ‘1!G;h;$p’ test.txt(逆行显示文件内容)
保持空间使用的一个例子:
需求:把单词the和statement之间的单词的全部改为大写
原文:
find the Match statement
consult the Get statement
using the Read statement to retrieve data
sed写法:
/the .*statement/{
h
s/.*the \(.*\)statement.*/\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/\(.*\)\n\(.*the \).*\( statement.*\)/\2\1\3/
}
结果:
find the MATCH statement
Consult the GET statement
using the READ statement to retrieve data
解析:
/the .*statement/:匹配这种模式的行,然后进行修改
h:将匹配到的内容覆盖至保持空间,保留一份复本
s/.*the \(.*\)statement.*/\1/:在模式空间中将匹配到行转换为要改变的单词
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/:将修改后的单词转换为大写
G:把保持空间的复本追加到模式空间
s/\(.*\)\n\(.*the \).*\( statement.*\)/\2\1\3/:将修改为大写的单词替换到原语句中的单词
从这个脚本可以看出,灵活的使用保持空间对于隔离和操作输入行的某部分内容很有用
本文转自激情燃烧的岁月博客51CTO博客,原文链接http://blog.51cto.com/liuzhengwei521/1883236如需转载请自行联系原作者
weilovepan520