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

标签 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 上的最后一个 "之前的所有内容。

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

最佳答案

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

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

关于linux - sed 删除包含多个引号的行中引号内的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27960501/

相关文章:

linux - 在 AWK 中使用 if/else 语句

php - Composer 更新显示 mmap() 失败 : [12] Cannot allocate memory

linux - 自定义 Linux 安装程序

linux - 使用 awk 命令行组合列

bash - PostgreSQL 数据库如何在两个连续的 shell 命令之间停止存在?

linux - 使用 awk 对常见元素进行分组

linux - bitrock 安装程序 - Linux 入门

PHP远程文件上传进度条

python - 尝试从华为调制解调器读取消息时出现错误 125002

linux - 替换一行结束后的第二个点