我有一个名为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上。
非常感谢您的时间和帮助。
答案 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
并打印出来。