如何使用 sed 搜索模式并替换该行上的另一个子字符串

如何使用 sed 搜索模式并替换该行上的另一个子字符串

我需要找到数据文件中包含 NO_ID 的所有行,然后用“待确认”替换字符串“已确认”。

我试过这个:

sed '/NO_ID/, s/confirmed/to be confirmed/' stats.txt

这似乎不起作用。

答案1

删除逗号。初始正则表达式充当后续s命令的“地址”(此处显示的地址和命令之间的空格是可选的):

sed '/NO_ID/ s/confirmed/to be confirmed/' stats.txt

如果我们将单词替换为命令confirmed中正则表达式匹配的内容,则可以进一步缩短:s

sed '/NO_ID/ s/confirmed/to be &/' stats.txt

如果您需要确保包含的行to be confirmed不被修改:

sed '/NO_ID/ { /to be confirmed/!s/confirmed/to be &/; }' stats.txt

或者,

sed -e '/to be confirmed/b' -e '/NO_ID/ s/confirmed/to be &/' stats.txt

在这里,第一个命令首先检测包含的行NO_ID并将替换应用于这些行,除非该行还包含to be confirmed。第二个命令检测并跳过包含的行to be confirmedb指令跳转到脚本末尾,导致该行不再被进一步修改而是打印)。不包含的行将to be confirmed进行与原始命令相同的修改。

答案2

像这样:

sed '/NO_ID/ s/confirmed/to be confirmed/' stats.txt
#          ^

这里没有逗号

相关内容