こんにちは。私はこの分野が初めてなのでご了承ください。単語を変更したい.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
。この行では、部分文字列APPLE
をMANGO
。効果が初めて表示されます。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
。その後、フラグ変数はfound
1に設定されます(ブール本物値)交換が再び発生するのを防ぎます。変更の有無にかかわらず、各行は無条件に印刷されます。
使用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/.*//