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
我有一个文件 "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