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 | $ echo "This is a test" | sed 's/test/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 | # 地址作用单个命令 |
地址可以是:行号,正则表达式,或者匹配区间,具体如下面例子所示:
1 | $ sed '2s/dog/cat/' data # 只作用于第2行 |
定界符
sed中一般使用正斜线作为字符串的分隔符,当然也允许使用其他字符作为定界符。
1 | $ sed 's/text/TEXT/g' |
但是定界符出现在样式内部时,需要进行转义。最常见的就是在Linux中文件路径是正斜线,如果sed的命令表达式也使用正斜线作为定界符,就必须使用反斜线转义。
1 | sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd |