sed正则表达式替换为引号

时间:2012-04-09 16:18:56

标签: regex sed

假设我有一个包含许多行的文本文件,其中一行是这样的:

  <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

但都无济于事。输入和输出始终相同。

4 个答案:

答案 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