繰り返される単語の1つを置き換える

繰り返される単語の1つを置き換える

こんにちは。私はこの分野が初めてなのでご了承ください。単語を変更したい.txtファイルがあり、問題はその単語が何度も繰り返されることです(このような行が何百万ものあると仮定しています)。

TOPIC:
APPLE
APPLE
APPLE
BANANA

こうして初めて出てくるアップルをマンゴに交換したいです。

TOPIC:
MANGO
APPLE
APPLE
BANANA

sedまたはawkを介して特別にこれを行う方法はありますか(私の知る限り、sedは単語を置き換えるために使用できますが、複数行の入力は使用できません。私の場合は最初の単語だけを置き換えようとしています)。 、ツールを使用して他の方法で実装できる場合は良いでしょう。

答え1

sed以下の内容を示す最初の行が常にあるとし、使用してくださいAPPLE

sed '1,/APPLE/ s/APPLE/MANGO/' file

これは、行1から部分文字列を含む次の行まで一致しますAPPLE。この行では、部分文字列APPLEMANGO。効果が初めて表示されます。APPLE 最初の行以降に置き換えられますMANGO

GNUでは、sed次のことができます。

sed '0,/APPLE/ s/APPLE/MANGO/' file

部分文字列が含まれている場合、最初の行も上書きされますAPPLE


そしてawk

awk '!found && /APPLE/ { sub("APPLE", "MANGO"); found = 1 }; 1' file

APPLEこれは各行で部分文字列を見つけようとし、一度見つかったらsub()呼び出しは部分文字列をMANGO。その後、フラグ変数はfound1に設定されます(ブール本物値)交換が再び発生するのを防ぎます。変更の有無にかかわらず、各行は無条件に印刷されます。


使用ed:

printf '%s\n' '/APPLE/ s//MANGO/' ,p Q | ed -s file

部分文字列を含む行を検索しますAPPLE。見つかったら、部分文字列をに置き換えますMANGO。ファイルの最初の一致のみが処理されます。

スクリプトの編集

/APPLE/ s//MANGO/
,p
Q

検索と置換を行い、編集バッファ全体を標準出力として印刷し、無条件に終了します。

答え2

$ awk '$0=="APPLE" && !done++{ $0="MANGO" } 1' file
TOPIC:
MANGO
APPLE
APPLE
BANANA

答え3

使用perl:

$ perl -lpe '$_ = "MANGO" if m?APPLE?' file

結果:-

TOPIC:
MANGO
APPLE
APPLE
BANANA

POSIX sed 構成では、次の操作も実行できます。

sed -e '
  1{x;s/^/MANGO/;x;}
  /APPLE/!b
  G
  /\n$/{P;d;}
  z;x
' file

POSIX sedzに置き換えられました。s/.*//

関連情報