Sed - 1:基本概念

Sed编辑器

Sed编辑器被称作“流编辑器”,不同于一般的交互式文本编辑器(比如Vim、nano)需要用户交互式的输入来编辑文本内容,Sed会基于预先提供的一组规则来编辑数据流。在Shell脚本中,解析LOG文件或修改配置文件等处理文本文件的任务非常普遍。而Sed这样的命令行编辑器正好满足在Shell脚本中完成自动处理文本的需求。

调用选项

1
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
选项 描述
-e 进行多项编辑,即对输入行应用多条sed命令时使用
-n 取消默认的输出, 等待print命令输出
-i 表示将转换结果直接插入文件中
-f 按照指定的sed脚本里面的命令来进行转换

如果sed调用时没有 -e,-f 或者 –file 参数,第一个非选项的参数将被作为sed脚本,剩余参数都将作为输入文件名。
如果未指定输入文件名,sed将会读取标准输入STDIN。在shell编程中,用户可以直接将数据管道输出到sed上进行处理。

1
2
$ echo "This is a test" | sed 's/test/big test/'
This is a big test

由于-i选项会直接修改原文件,在操作重要文件时请谨慎使用。
如果未指定-i选项,sed不会改变原文件中的内容,只会将结果导出到标准输出。用户也可以用>重定向到另一个文件。
在实际应用中,可以用sed基于配置文件模板,生成新的配置文件。

1
sed 's/Version:VER/Version:5.0/g' config_template > config

上面例子中sed读取config_template内容,将版本改为5.0,然后生成新的config文件。

行寻址

默认情况下sed中使用的命令会作用于文本数据的所有行。如果需要限定命令只作用于某些行,需要指定行寻址(line addressing)。

1
2
3
4
5
6
7
8
# 地址作用单个命令
[address] command
# 地址作用于多个命令
[address] {
command1
command2
command3
}

地址可以是:行号,正则表达式,或者匹配区间,具体如下面例子所示:

1
2
3
4
5
6
7
8
9
10
$ sed '2s/dog/cat/' data           # 只作用于第2行
$ sed '2,5s/dog/cat/' data # 作用于2至5行
$ sed '5,$s/dog/cat/' data # 作用于5到最后一行
$ sed '/pattern/s/dog/cat/' data # 只作用于匹配pattern的行
$ sed '/pattern1/,/pattern2/s/dog/cat/' data # 作用于匹配pattern1的行到匹配pattern2的行之间
$ sed '2,/pattern/s/dog/cat/' data # 开始于第2行,直到匹配pattern的行结束
$ sed '2{
> s/fox/elephant/
> s/dog/cat/
}' # 多个命令

定界符

sed中一般使用正斜线作为字符串的分隔符,当然也允许使用其他字符作为定界符。

1
2
3
$ sed 's/text/TEXT/g'
$ sed 's:text:TEXT:g'
$ sed 's|text|TEXT|g'

但是定界符出现在样式内部时,需要进行转义。最常见的就是在Linux中文件路径是正斜线,如果sed的命令表达式也使用正斜线作为定界符,就必须使用反斜线转义。

1
2
sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
sed 's!/bin/bash!/bin/csh!' /etc/passwdls

更多内容……

Sed - 2: 常用功能
Sed - 3: 高级功能
Sed - 4: 经典用例