2012-04-09 114 views
3

假设我有很多行的文本文件,其中之一是这样的: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 

但都无济于事。输入和输出总是相同的。

+0

感谢您的答案。我会尝试他们,并尽快接受最合适的一个。 – 2012-04-10 23:55:05

回答

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为您的搜索目标锚定'^'和'$'。我已经看到了情况(类似于你在做什么),没有锚会大大增加运行时间。

我希望这会有所帮助。

+1

为了记录,sed需要'\ +'为“一个或多个”。 – Kevin 2012-04-09 22:53:19

+0

我很欣赏共同的努力。基本上,这个答案中的第一个代码片段就是答案,这是我的第一次尝试,但将@ Kevin的关于sed需要'\ +'的评论合并为“一个或多个”。谢谢你们俩。 – 2012-05-19 07:19:51

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> 
2

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

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

这并不是因为“聪明”为你我能找到一个解决方案,但因为他们来是那么简单,当你正在寻找一个静态字符串,这是你所需要的。

+0

我不是这个答案的忠实粉丝。 XML可能是正确的,但包含额外的空白。由于缺乏正则表达式,这不是一个不那么聪明的解决方案。这只是不健壮。 (诚​​然,正则表达式解决方案也不是万无一失,但比这更强大。)但是,谢谢。 – 2012-05-19 07:21:04

0

这可能会为你工作:

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

或者是:

sed -i 's/"8080"/"80"/' config.xml