文字列を置き換えるには辞書を使用してください。

文字列を置き換えるには辞書を使用してください。

辞書を使用してファイル内の文字列置換を実行する良い方法は何ですかたくさん置換末端置換基対?そしてたくさん、実際には20個程度を意味します。多くはありませんが、きれいに整理したいほど十分です。

dictionary.txt次のような多くの項目を置き換える必要があるため、管理可能な方法ですべての置換された最終置換基のペアをファイルに収集したいと思います。

"yes"      : "no"
"stop"     : "go, go, go!"
"wee-ooo"  : "ooooh nooo!"
"gooodbye" : "hello"

"high"     : "low"
"why?"     : "i don't know"

今、特定のファイルにこれらの代替項目を適用したいと思いますnovel.txt

その後、inのすべてのインスタンスが置き換えられ(それでEvenが置き換えられます)、inのすべてのインスタンスが置き換えられるmagiccommand --magicflags dictionary.txt novel.txtように実行しようとします。yesnovel.txtnoBayesianBanoiangoodbyenovel.txthello

これまでに置き換える必要がある文字列は次のとおりです。いいえその中に引用符があります(一重引用符や二重引用符ではありません)。 (もちろん、引用符付きの文字列をうまく処理する解決策を見るとよいでしょう。)

私も知っていてsed/ awkmaingawkもこれを行うことができますが、このような辞書ファイルも使用できますか?gawk適切な候補者のようですmagiccommand。適切な候補者は誰ですかmagicflags?どのようにフォーマットする必要がありますかdictionary.txt

ベストアンサー1

方法は次のとおりですsed

sed '
s|"\(.*\)"[[:blank:]]*:[[:blank:]]*"\(.*\)"|\1\
\2|
h
s|.*\n||
s|[\&/]|\\&|g
x
s|\n.*||
s|[[\.*^$/]|\\&|g
G
s|\(.*\)\n\(.*\)|s/\1/\2/g|
' dictionary.txt | sed -f - novel.txt

仕組み:
最初のファイルはスクリプトファイルにsedなります(編集コマンド、1行に1つ)。dictionary.txtこれは、これらのコマンドを実行する2番目のコマンドsed(注:これは-f -読み取りコマンドを意味しますstdin)、editにパイプされますnovel.txt
形式を翻訳する必要があります。

"STRING"   :   "REPLACEMENT"

コマンドに入れて、sedプロセス内のすべての特殊文字をエスケープしますLHSRHS

s/ESCAPED_STRING/ESCAPED_REPLACEMENT/g

だから最初の交換

s|"\(.*\)"[[:blank:]]*:[[:blank:]]*"\(.*\)"|\1\
\2|

(改行文字です)になります"STRING" : "REPLACEMENT"。次に、結果を前のスペースにコピーします。最初の部分を削除し、予約文字(これは)のみを保持してからエスケープします。次に、パターンスペースを使用して保持バッファを変更し、保持された2番目の部分のみを削除してエスケープします(つまり)。その後、バッファの内容はパターン空間に追加されたままになるので、パターン空間の内容は 。最終交換STRING\nREPLACEMENT\nh
s|.*\n||REPLACEMENTs|[\&/]|\\&|gRHS
xs|\n.*||STRINGs|[[\.*^$/]|\\&|gLHS
GESCAPED_STRING\nESCAPED_REPLACEMENT

s|\(.*\)\n\(.*\)|s/\1/\2/g|

それに変換するs/ESCAPED_STRING/ESCAPED_REPLACEMENT/g

おすすめ記事