我们有以下文件:
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