sed2

发表于:2007-05-26来源:作者:点击数: 标签:
接上周 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 noNE

接上周

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.html 
 This is what I meant. 
处理后把其中<>及其中所包括的字符都删除。
上面的规则表达式表达式[^>]不包含>。
# sed -e  's/geo[^s]*/test/g' 9
tests
test
# sed -e  's/geo[^s]/test/g' 9
testge noNEWLINE testges
testge noNEWLINE testge
组合
# sed -n -e '=;p' 9
1
george noNEWLINE georges
2
3
george noNEWLINE george
开始创建更复杂的 sed 脚本时,需要有输入多个命令的能力。有几种方法这样做。首先,可以在命令之间使用分号。例如,以下命令系列使用 '=' 命令和 'p' 命令,'=' 命令告诉 sed 打印行号,'p' 命令明确告诉 sed 打印该行(因为处于 '-n' 模式)。

无论什么时候指定了两个或更多命令,都按顺序将每个命令应用到文件的每一行。在上例中,首先将 '=' 命令应用到第 1 行,然后应用 'p' 命令。接着,sed 继续处理第 2 行,并重复该过程。虽然分号很方便,但是在某些场合下,它不能正常工作。另一种替换方法是使用两个 -e 选项来指定两个不同的命令:

# sed -n -e '=' -e 'p' 9
1
george noNEWLINE georges
2
3
george noNEWLINE george

然而,在使用更为复杂的附加和插入命令时,甚至多个 '-e' 选项也不能帮我们的忙。对于复杂的多行脚本,最好的方法是将命令放入一个单独的文件中。然后,用 -f 选项引用该脚本文件:

 $ sed -n -f mycommands.sed myfile.txt 

这种方法虽然可能不太方便,但总是管用。


	
	
 



           

原文转自:http://www.ltesting.net