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

sed delete match within quotes on line containing several quotes

我有一个名为 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 上直到最后一个 " 的所有内容。

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

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

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

这是一个 awk 版本:

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

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