接上周
http://www-900.ibm.com/developerWorks/cn/linux/shell/sed/sed-2/index.shtml
替换:s
# sed -e 's/geo/test/' 9
testrge noNEWLINE georges
testrge noNEWLINE george
全局:g
# sed -e 's/geo/test/g' 9
testrge noNEWLINE testrges
testrge noNEWLINE testrge
#
# sed -e '1s/geo/gest/g' 9
gestrge noNEWLINE gestrges
george noNEWLINE george
上面的例子可以看到s///只是一个命令,它可以和其他的命令混合使用。
关于 's///' 命令的另一个妙处是 '/' 分隔符有许多替换选项。如果正在执行字符串替换,并且规则表达式或替换字符串中有许多斜杠,则可以通过在 's' 之后指定一个不同的字符来更改分隔符。例如,下例将把所有出现的 /usr/local 替换成 /usr:
$ sed -e 's:/usr/local:/usr:g' mylist.txt
# sed -e 's:geo:test:g' 9
testrge noNEWLINE testrges
testrge noNEWLINE testrge
规则比较多时候可能会出现混乱,有一种简便方法来纠正该问题。我们不输入“'<' 字符后面跟有一些字符并以 '>' 字符结束”的规则表达式,而只需输入一个“'<' 字符后面跟有任意数量非 '>' 字符并以 '>' 字符结束”的规则表达式。这将与最短、而不是最长的可能性匹配。新命令如下:
$ sed -e 's/<[^>]*>//g' myfile.htmlThis is what I meant.处理后把其中<>及其中所包括的字符都删除。上面的规则表达式表达式[^>]不包含>。# sed -e 's/geo[^s]*/test/g' 9
teststest
# sed -e 's/geo[^s]/test/g' 9
testge noNEWLINE testgestestge noNEWLINE testge组合# sed -n -e '=;p' 9
1
george noNEWLINE georges
23
george noNEWLINE george
开始创建更复杂的 sed 脚本时,需要有输入多个命令的能力。有几种方法这样做。首先,可以在命令之间使用分号。例如,以下命令系列使用 '=' 命令和 'p' 命令,'=' 命令告诉 sed 打印行号,'p' 命令明确告诉 sed 打印该行(因为处于 '-n' 模式)。无论什么时候指定了两个或更多命令,都按顺序将每个命令应用到文件的每一行。在上例中,首先将 '=' 命令应用到第 1 行,然后应用 'p' 命令。接着,sed 继续处理第 2 行,并重复该过程。虽然分号很方便,但是在某些场合下,它不能正常工作。另一种替换方法是使用两个 -e 选项来指定两个不同的命令:
# sed -n -e '=' -e 'p' 9
1
george noNEWLINE georges
23
george noNEWLINE george然而,在使用更为复杂的附加和插入命令时,甚至多个 '-e' 选项也不能帮我们的忙。对于复杂的多行脚本,最好的方法是将命令放入一个单独的文件中。然后,用 -f 选项引用该脚本文件:
$ sed -n -f mycommands.sed myfile.txt这种方法虽然可能不太方便,但总是管用。