假设我有一个包含许多行的文本文件,其中一行是这样的:
<property name="HTTP_PORT" value="8080"></property>
我想用sed改变它:
<property name="HTTP_PORT" value="80"></property>
我该怎么做?我尝试过很多东西,包括:
sed 's/^\(.+\)value=\"8080\"\(.+\)$/\1value=\"80\"\2/g' config.xml
sed 's/^\(.+\)value="8080"\(.+\)$/\1value="80"\2/g' config.xml
sed 's/^\(.+\)8080(.+\)$/\180\2/g' config.xml
sed 's/^\(.+\)\"8080\"\(.+\)$/\1\"80\"\2/g' config.xml
sed 's/^\(.+\)"8080"\(.+\)$/\1"80"\2/g' config.xml
但都无济于事。输入和输出始终相同。
答案 0 :(得分:2)
如何直接翻译你想要的东西:
sed 's|<property name="HTTP_PORT" value="8080"></property>|<property name="HTTP_PORT" value="80"></property>|g'
它不像你或我能找到的那样“聪明”一个解决方案,但它就像它们来的一样简单,当你在寻找静态字符串时,它就是你所需要的。
答案 1 :(得分:1)
@Kevin的修正(谢谢!)
echo $'<property name="HTTP_PORT" value="8080"></property>'\
| sed 's/^\(.\+\)value=\"8080\"\(.\+\)$/\1value=\"80\"\2/g'
正确的解决方法是将'。+'转义为加号以达到'1或更多'。
编辑原始答案(显示问题的替代解决方案) * 因此,鉴于您使用的上下文,传统.*
(零或更多)有什么问题) *
echo $'<property name="HTTP_PORT" value="8080"></property>'\
| sed 's/^\(.*\)value=\"8080\"\(.*\)$/\1value=\"80\"\2/g'
**输出**
<property name="HTTP_PORT" value="80"></property>
此外,+1用于将搜索目标锚定为“^”和“$”。我见过的情况(类似于你正在做的事情),没有锚点会大大增加运行时间。
我希望这会有所帮助。
答案 2 :(得分:0)
$> cat text
<property name="HTTP_PORT" value="8080"></property>
$> sed --regexp-extended 's/(value=\")[0-9]*/\180/' text
<property name="HTTP_PORT" value="80"></property>
答案 3 :(得分:0)
这可能对您有用:
sed -i '\|<property name="HTTP_PORT" value="8080"></property>|s/80//' config.xml
或者也许:
sed -i 's/"8080"/"80"/' config.xml