sed删除包含多个引号的行内引号内的匹配项

时间:2015-01-15 09:39:28

标签: linux bash awk sed

我有一个名为names.xml的文件

如下所示:

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

我需要找到所有出现的NAME =“和”“引号我需要用其他值替换名称。

因此输出需要如下所示:

    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

它正在查看所有内容,直到最后一个“在SURNAME上。

非常感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:5)

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

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

答案 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=,则将2替换为Jack并打印出来。