3

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

  <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

4 回答 4

2

直接翻译你想要的怎么样:

sed 's|<property name="HTTP_PORT" value="8080"></property>|<property name="HTTP_PORT" value="80"></property>|g'

它不像您或我能找到的那样“聪明”的解决方案,但它就像它们一样简单,并且当您正在寻找静态字符串时,这就是您所需要的。

于 2012-04-09T22:58:11.743 回答
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 用于使用“^”和“$”锚定搜索目标。我见过一些案例(类似于您正在做的事情),没有锚点会大大增加运行时间。

我希望这有帮助。

于 2012-04-09T17:47:39.390 回答
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>
于 2012-04-09T16:22:55.643 回答
0

这可能对您有用:

sed -i '\|<property name="HTTP_PORT" value="8080"></property>|s/80//' config.xml

也许:

sed -i 's/"8080"/"80"/' config.xml
于 2012-04-09T23:41:58.253 回答