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
并打印。
我有一个名为 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
并打印。