辞書を使用してファイル内の文字列置換を実行する良い方法は何ですかたくさん置換末端置換基対?そしてたくさん、実際には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
ように実行しようとします。yes
novel.txt
no
Bayesian
Banoian
goodbye
novel.txt
hello
これまでに置き換える必要がある文字列は次のとおりです。いいえその中に引用符があります(一重引用符や二重引用符ではありません)。 (もちろん、引用符付きの文字列をうまく処理する解決策を見るとよいでしょう。)
私も知っていてsed
/ awk
maingawk
もこれを行うことができますが、このような辞書ファイルも使用できますか?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
プロセス内のすべての特殊文字をエスケープしますLHS
。RHS
s/ESCAPED_STRING/ESCAPED_REPLACEMENT/g
だから最初の交換
s|"\(.*\)"[[:blank:]]*:[[:blank:]]*"\(.*\)"|\1\
\2|
(改行文字です)になります"STRING" : "REPLACEMENT"
。次に、結果を前のスペースにコピーします。最初の部分を削除し、予約文字(これは)のみを保持してからエスケープします。次に、パターンスペースを使用して保持バッファを変更し、保持された2番目の部分のみを削除してエスケープします(つまり)。その後、バッファの内容はパターン空間に追加されたままになるので、パターン空間の内容は 。最終交換STRING\nREPLACEMENT
\n
h
s|.*\n||
REPLACEMENT
s|[\&/]|\\&|g
RHS
x
s|\n.*||
STRING
s|[[\.*^$/]|\\&|g
LHS
G
ESCAPED_STRING\nESCAPED_REPLACEMENT
s|\(.*\)\n\(.*\)|s/\1/\2/g|
それに変換するs/ESCAPED_STRING/ESCAPED_REPLACEMENT/g