私たちは次のファイルを持っています:
more /tmp/file
Allow,Deny
Allow,Deny
2番目に一致する単語のみを変更したい(Allow、DenyをDeny、Allowに置き換えます)。
だから私たちはそうでした。
sed 's/Allow,Deny/Deny,Allow/1' /tmp/file
Deny,Allow
Deny,Allow
しかし、それはそれらを置き換えます
そして予想される結果は次のとおりです。
Allow,Deny
Deny,Allow
2番目に一致する単語だけを置き換える方法
答え1
別のsedソリューション。
sed '0,/Allow/!{0,/Allow/s/Allow/Deny/}' /tmp/file
ここでは、最初の項目を一致させ、Allow
最初の項目の代替項目を無視してAllow
次の行を置き換えます。
アイデアを提供するために、以下は私たちが使用した後、2番目と4番目のものを置き換えます。N;
sed '0,/Allow/!{N;/Allow/s/Allow/Deny/}'
または以下を使用してくださいawk
。
awk '/Allow/{c++; if (c==2) { sub("Allow","Deny")}}1'
一致させてAllow
からカウンターを維持しますc
。これが2
2番目の発生と一致する場合は、それを置き換えます。
答え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