sed -e 'command1' -e 'command2' -e 'command3'
匹配root或nobody,或mail:
sed -n -e '/^root/ p' -e '/^nobody/ p' -e '/^mail/p' /etc/passwd
Shell的换行符依然有效,这有利于提高长命令的可读性。
- sed -n -e '/^root/ p' \
- -e '/^nobody/ p' \
- -e '/^mail/p' /etc/passwd
- sed -n '{
- /^root/ p
- /^nobody/ p
- /^mail/ p
- }' /etc/passwd
如果需要复用一组sed命令,可以把它们写入一个脚本文件,然后用命令行参数-f调用。
数据文件data.txt内容:
- 101,Zhang san,Fu Jian
- 102,Li si,Shan Dong
- 103,Wang Wu,Bei Jing
- 104,Zhao Qian Sun,Zhe Jiang
- 105,Ge Lin,Shang Hai
脚本文件cmd.sed
- s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1,\3/g
- s/^.*/<&>/
- s/Li/Lee/
执行命令
sed -f cmd.sed data.txt
sed脚本的注释行以井号#打头。为上面的脚本加上注释:
- # Swap field 1 (id) with field 2 (name)
- s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1,\3/g
- # Enclose the whole line within < and >
- s/^.*/<&>/
- # Replace Li with Lee
- s/Li/Lee/
如果sed脚本 的首行的前两个字符为#n,那么sed会自动使用-n选项(不打印),这时打印需要脚本中显式调用p命令。
刚才演示的sed脚本执行过程,是从命令行用sed 命令加上-f参数选项调用的。那么,能否像shell脚本那样直接./执行呢?答案是肯定的。方法是在脚本的首行,调用sed作为命令解释器,换句话说,把脚本首行内容写为"#!/bin/sed -f"
- #!/bin/sed -f
- # Swap field 1 (id) with field 2 (name)
- s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1,\3/g
- # Enclose the whole line within < and >
- s/^.*/<&>/
- # Replace Li with Lee
- s/Li/Lee/
然后,赋予脚本可执行权限:
chmod 755 cmd.sed
接下来执行它:
./cmd.sed data.txt
效果和之前是一样的。
sed缺省不会修改输入文件的内容。它会把修改后的内容输出到终端上。如果你需要保存修改后的内容,可以把它们重定向到另一个文件,或者用w命令写文件。如果你的目的就是修改源文件,那么,你还需要用新生成的文件覆盖源文件。
sed本身提供了一个-i选项,可以轻松的实现这个目的。在使用它之前,请先备份自己的源始数据文件。
sed -i -f cmd.sed data.txt