2015-01-15 53 views
0

我有一个名为names.xmlSED上线引号内删除匹配包含几个报价

文件看起来像下面:

NAME="Stacey" SURNAME="Ford" 
    blah blah blah 
    NAME="Stacey" SURNAME="Ford" 
    blah blah blah 

我需要找到所有名为名称的=”,并与在“”引号,我需要用另一个值替换名称

所以输出需要这个样子:

NAME="Jack" SURNAME="Ford" 
    blah blah blah 
    NAME="Jack" SURNAME="Ford" 
    blah blah blah 

我使用:sed 's/NAME=".*"/NAME="Jack"/g' names.xml

不过这是结果它给了我:

NAME="Jack" 
    blah blah blah 
    NAME="Jack" 
    blah blah blah 

据看着一切,直到最后“的姓氏。

您的时间和协助是非常感谢。

回答

5

您需要使用否定字符类[^"]*,该字符类与任何字符匹配,但不包含"零次或多次。 .*在你的正则表达式中默认情况下是贪婪的,它会把所有的字符吃掉直到最后一个"双引号。所以只有它匹配Stacey和最后的Ford。而且您还必须在NAME之前添加一个字边界\b,以便它与SURNAME中的字符串NAME不匹配。 \b匹配单词字符和非单词字符。

sed 's/\bNAME="[^"]*"/NAME="Jack"/g' names.xml 
+0

这不起作用,它也匹配姓氏,你应该删除'g'。 –

+0

对不起,添加了一个字边界..现在尝试.. –

+1

是的,现在工作。尼斯 –

2

这里是一个awk版本:

awk -F\" -vOFS=\" '$1~/NAME=/ {$2="Jack"}1' file 
    NAME="Jack" SURNAME="Ford" 
    blah blah blah 
    NAME="Jack" SURNAME="Ford" 
    blah blah blah 

使用"作为字段分隔符。如果字段1包含NAME=替换提交2Jack并打印它。