sed +は、2番目に一致する単語のみを置き換えます。

sed +は、2番目に一致する単語のみを置き換えます。

私たちは次のファイルを持っています:

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。これが22番目の発生と一致する場合は、それを置き換えます。

答え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

関連情報