简介
sed命令应用广泛,使用简单,是文本流编辑器的利器,逐行对文件的内容进行处理处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),可以指定仅仅处理哪些行。sed处理完成之后把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复, 直到文件末尾。sed符合条件的处理,不符合条件的不予处理,文件内容并没有改变,除非用重定向存储输出。
一. 简单入门
1. 输出范围行
参数 -n 这个参数是--quiet或者--silent的意思。表明忽略执行过程的输出,只输出我们的结果即可。
我们常用的还有另外一个参数:-i。使用此参数后,所有改动将在原文件上执行。你的输出将覆盖原文件。非常危险,一定要注意。
范围1,4 表示找到文件中1,2,3,4行的内容。这个范围的指定很有灵性,请看以下示例(请自行替换图中的范围部分)。
5 选择第5行。
2,5 选择2到5行,共4行。
1~2 选择奇数行。
2~2 选择偶数行。
2,+3 和2,5的效果是一样的,共4行。
2,$ 从第二行到文件结尾。
范围的选择还可以使用正则匹配。
请看下面示例:
/abc/,+3 选择出现abc字样的行,以及后面的三行。
/^abc/,/xyz / 选择以abc开头的行,和出现xyz字样行之间的数据。
为了直观,下面的命令一一对应上面的介绍,范围和操作之间是可以有空格的。
sed -n '5p' test.txt
sed -n '2,5 p' test.txt
sed -n '1~2 p' test.txt
sed -n '2~2 p' test.txt
sed -n '2,+3p' test.txt
sed -n '2,$ p' test.txt
sed -n '/abc/,+3 p' test.txt
sed -n '/^abc/,/xyz/p' test.txt
操作 p表示打印
2 . 替换操作
替换模式的参数有点多,但第一部分和第五部分都是可以省略的,"/"可以用"@"、”#“等符号代替。替换后会将整个文本输出出来。前半部分用来匹配一些范围,而后半部分执行替换的动作。
这里的命令是指s。也就是substitute的意思。
sed 's/aaa/bbb/' a.txt #替换每一行的第1个aaa为bbb
sed 's/aaa/bbb/g' a.txt #替换每一行的所有aaa为bbb
sed 's/aaa/bbb/2' a.txt #替换每一行的第2个aaa为bbb
sed '1,10s/aaa/bbb/g' #替换第1行到第10行所有的aaa为bbb
sed 's/^[0-9]/(&)/' a.txt #将数字加上一个(), &为匹配到的内容
sed '/sys/,+3 s/a/b/g' file
sed '/^abc/,/xyz/s/a/b/g' file