sed + 仅替换第二个匹配单词

sed + 仅替换第二个匹配单词

我们有以下文件:

more /tmp/file

Allow,Deny
Allow,Deny

我们只想更改第二个匹配词(将 Allow,Deny 替换为 Deny,Allow )

所以我们做了

sed 's/Allow,Deny/Deny,Allow/1'  /tmp/file

Deny,Allow
Deny,Allow

但它取代了它们

而预期结果:

Allow,Deny
Deny,Allow

如何仅替换第二个匹配单词

答案1

另一个 sed 解决方案。

sed '0,/Allow/!{0,/Allow/s/Allow/Deny/}' /tmp/file

这里我们匹配第一个Allow,然后忽略对我们遇到的第一个的替换Allow并替换下一行。

为了给出一个想法,以下将替换第二个和第四个,因为我们使用了N;

sed '0,/Allow/!{N;/Allow/s/Allow/Deny/}'

或者使用awk

awk '/Allow/{c++; if (c==2) { sub("Allow","Deny")}}1'

我们匹配Allow然后保留一个计数器c。如果这与2第二次出现匹配,那么我们将其替换。

答案2

仅更改第二个匹配词(将 Allow,Deny 替换为 Deny,Allow )

sed解决方案:

样本tmp_file

Allow,Deny
Allow,Deny
Allow,Deny
Allow,Deny

sed ':a;N;$!ba; s/Allow,Deny/Deny,Allow/2' tmp_file

输出:

Allow,Deny
Deny,Allow
Allow,Deny
Allow,Deny

相关内容