sed 删除所有匹配项的一部分

sed remove part of all match occurrences

我有一个文件 "names.xml",如下所示:

    NAME="James"
    NAME="Jack_DONE"
    NAME="John_DONE"
    NAME="Jimmy"

我想使用单个 SED 行命令查找所有出现的“NAME="J' That has '_DONE' within the "”,并且我只想从找到的所有匹配项中删除“_DONE”。

所以结果应该是这样的:

    NAME="James"
    NAME="Jack"
    NAME="John"
    NAME="Jimmy"

这是我正在使用的命令:

sed 's/^[^#]\(.*\)NAME="J\(.*\)_DONE"/"NAME=J"/' names.xml

我相信我能以更有效的方式做到这一点! 非常感谢您的时间和帮助。

只需稍作调整即可修复引号和缩进的位置:

sed 's/^\([^#].*\)NAME="J\(.*\)_DONE"/NAME="J"/' names.xml

您可以使用:

sed -i.bak -r '/^#/!s/(NAME="J[^"]*)_DONE"/"/' file
NAME="James"
NAME="Jack"
NAME="John"
NAME="Jimmy"

使用 GNU sed:仅在包含 NAME="J 的行中搜索 _DONE 并替换为任何内容。

sed '/NAME="J/{s/_DONE//}' names.xml

输出:

    NAME="James"
    NAME="Jack"
    NAME="John"
    NAME="Jimmy"

这是一个 awk 版本:

awk '/NAME="J/ {sub(/_DONE/,"")}1' names.xml
    NAME="James"
    NAME="Jack"
    NAME="John"
    NAME="Jimmy"

要将其写回文件:

awk '/NAME="J/ {sub(/_DONE/,"")}1' names.xml > tmp && mv tmp names.xml

或者如果您有 gnu awk >= 4.1

awk -i '/NAME="J/ {sub(/_DONE/,"")}1' names.xml