俏皮的sed

提到awk也一定会想起sed,sed是流编辑器(stream editor)的缩写,是文本编辑的常用工具,结合正则表达式使用功能更强大,同awk一样记录下常用的用法供日后查询使用。
sed替换文本中字符串的格式

1
$ sed 's/符合条件旧的字符串/代替换新的字符串/' filename

被替换的字符串一般用正则表达式表示,更多时候是某种匹配模式。上面的命令只会将每行第一个符合条件的字符串替换并将结果打印到标准输出设备如控制台,如果想直接修改文本且是全部符合条件的字符串都替换的话应该这样

1
$ sed -i 's/符合条件旧的字符串/代替换新的字符串/g' filename

-i参数是将更改保存到当前文件中;
/g意思是全文(每行)都符合条件的字符串。
关于定界符在sed中我们通常用的是/,然而我们可以使用任意的符号作为定界符,下面的语句等价。不过需要注意的是如果替换或被替换的字符串中包含定界符时需要用到转义符\

1
2
3
4
5
$ sed 's/符合条件旧的字符串/代替换新的字符串/' filename 
$ sed 's#符合条件旧的字符串#代替换新的字符串#' filename
$ sed 's:符合条件旧的字符串:代替换新的字符串:' filename
$ sed 's?符合条件旧的字符串?代替换新的字符串?' filename
... .... ...

关于双引号和单引号的区别,由于sed不像awk有类似$1,$2那样的内部变量,使用双引号的时候可能困惑会少点。sed使用双引号主要用于引用外部变量,一般用单引号,说到怎样引入外部变量,来看看

1
2
3
$ a='abc' 
$ b='123'
$ echo 'abc abc 123' | sed "s/abc/123/g" 123 123 123

以下语句常用
1、打印指定行的内容

1
2
3
$ sed -n '1,2p' install.log 
Installing libgcc-4.4.7-3.el6.x86_64
warning: libgcc-4.4.7-3.el6.x86_64: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY

2、移除空白行

1
$ sed '/^$/d' filename

3、移除匹配样式的行

1
2
#pattern代表正则表达式或字符串
$ sed '/pattern/d' filename

4、sed组合多个表达式使用

1
2
3
4
5
6
7
$ echo -e "a\nb\nc\nd" | sed '/b/d' | sed '/c/d' 
a
d
# 等价于
$ echo -e "a\nb\nc\nd" | sed '/b/d; /c/d'
a
d

5、删除行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cat testfile 
1
2
3
4
# 删除指定的行,如删除第3行
$ cat testfile | sed '3d'
1
2
4
# 删除连续的行,如删除第2到4行
$ cat testfile | sed '2,4d'
1
# 删除不连续的行,如删除1,3行
$ cat testfile | sed '1d;3d'
2
4

6、在指定行的下追加新行

1
2
3
4
5
6
$ cat testfile | sed '1a 追加的新内容' 
1
追加的新内容
2
3
4

7、整行内容的替换

1
2
3
4
5
6
7
8
9
$ cat testfile | sed '1,2c 我被替换了' 
我被替换了
3
4
$ cat testfile | sed '2c 我被替换了'
1
我被替换了
3
4

现在能够想起来的用法大概就这些,以后遇到再收集添加,awk和sed非常强大远超我提到的这些,有兴趣的可以深入挖掘。

----------------本文结束 感谢阅读----------------