Linux文本处理利器 -- sed
Sed是UNIX/Linux系统上提供的将编辑工具自动化的编辑器,可以直接编辑文件。Sed以行为编辑
单位(行编辑器)。相比vim,gedit等编辑工具,Sed编辑文件只需要一条命名就可以解决很多的
问题,而且Sed对正则表达式的支持也非常好,的确是Linux下文本处理的利器。
1 使用方法
1)
sed OPTIONS... [SCRIPT] [INPUTFILE...]
--- ------------ -------------------
| | |--------------被修改的文件,如果没有定义则结果会输出到标准输出中
| |-------------------------------------动作,定义sed具体的操作,通常为''或者""中的字符串
|----------------------------------------------sed命令选项
2 常用参数说明(OPTIONS)
-n | --quiet | --silent : 只有经过处理的行才显示在标准输出中
-e script | --expression= script : 加入一个动作来处理,多个动作使用多个此参数
-f script-file | --file=script-file : 使用文件中的sed动作
-i[SUFFIX] | --in-place[=SUFFIX]: 直接修改文件,而不输出到屏幕上
-r | --regexp-extended : 使用扩展的正则表达式
3 如何写一个sed的动作(SCRIPT) -- ★重要★
如何写一个sed动作,简单来讲就是
①定位 --> 在文本中选到某行或者某几行作为操作的范围
②操作 --> 对上述选中的行进行操作(输出、新增、删除、修改)
③结果 --> 对上述操作的结果进行处理(输出到屏幕、直接修改文件)
3.1 如何选中行
number : 直接指定行数 ----> sed -n '2p' 指定第2行(p参数为输出到屏幕,下同)
first~step : 每step行中的第first行 ----> sed -n '1~2p' 每两行中的第一行,即奇数行
$ : 最后一行
/regexp/ : 匹配此正则表达式的行 ----> sed -n '/Ruby/p' 匹配所有含有Ruby字段的行
addr1,+N : addr1行和其后N行内容,'+'可以省略 ----> sed -n '2,5p' 指定2到5行
addr1,~N : addr1行和其后N的倍数行内容
3.2 如何进行操作 -- sed动作说明
[n1[,n2]] function
function如以下的参数
a : 新增 -- 选中行之后
c : 替换
d : 删除
i : 插入 -- 选中行之前
p : 打印
s : 替换,通常搭配正则表达式 --> 5,10s/old/new/g
3.3 关于sed的其他方面
1) 如何在sed中使用shell的变量
sed动作字符串使用双引号即可
如 :
var="insert a line"
sed "1a $var"
2) sed的结果传递给shell
var=`cat /etc/passwd | sed -n '2,5p'`
4 一些例子
1) 新增
sed -i '1a insert a line' test -- test文件第一行后新增
sed -i '/test/a insert a line' tes -- test文件中含有test字段的行后面增加一行
2)删除
sed -i '2,5d' test -- 删除test文件的2到5行内容
sed -i '/test/d' test -- 删除test文件中含有test字段的行
3)替换 ★重要★
命令格式 : sed 's/要被替换的字符串/新字符串/g'
sed -i 's/test/this is a replace/g' test -- 将test文件中test字段替换成成新的字段 (替换字符串)
cat /etc/man.config | grep "MAN" | sed 's/^#.*$//g' -- 删除所以以#号开头的注释行 (删掉整行)
cat /etc/man.config | grep "MAN" | sed 's/^$//g' -- 删掉空白行
捕获
sed -i 's/^test/&this is a new/' test -- 在test字符串后新增字符串(&代表所有捕获的字符串)
sed -i 's/^test\(.*\)$/\1this is a new/' test -- 将test替换成this is a new '\1'代表'\(\)'括号里面捕获的字符串,这里的括号需要转义
4)命令组合,使用shell命令
sed -i -e "s/^\(DEVICE=\).*$/\1eth1/g" -e "s/^\(HWADDR=\).*$/\1$(cat /sys/class/net/eth1/address)/g" /etc/sysconfig/network-scripts/ifcfg-eth1
说明 : ①一个 -e 后接一个sed动作,多个 -e 接多个动作
②可以在sed动作中使用shell的命令 $(cat /sys/class/net/eth1/address),但是命令必须要在双引号之间
5)文件读写 r 和 w
sed '/test/r file' test --- file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
sed -n '/test/w file' test --- 在test中所有包含test的行都被写入file里。
6) 保持和互换:h命令和x命令
sed -e '/test/h' -e '/check/x' test --- 现将含有test字段的行保存在缓冲区当中(h命令),再将含有check字段行替换成缓冲区的字符串(x命令)。实际作用就是交换两行的内容。
附录:sed中的元字符(使用于正则表达式)
^ : 行开头
$ : 行结束
. : 任意非换行字符
* : 零个或多个字符 如/.*/
[] : 匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^] : 不匹配指定范围的字符,与[]相反
\(..\) : 捕获组
& : 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< : 锚定单词的开始,如:/\
\> : 锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} : 重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
x\{m,\} : 重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
x\{m,n\}: 重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。