たくさんの辞書を使用してファイル内の文字列を置き換える良い方法は何ですか 置換基-置換基のペアの?そしてたくさん 、私は実際には約20を意味します–それほど多くはありませんが、それらをきちんと整理したいので十分な数です。
すべての置換基と置換基のペアをファイルdictionary.txt
に収集したいと思います。 たくさんのものを交換する必要があるので、管理しやすい方法で、次のように言います:
"yes" : "no"
"stop" : "go, go, go!"
"wee-ooo" : "ooooh nooo!"
"gooodbye" : "hello"
"high" : "low"
"why?" : "i don't know"
次に、これらの置換をいくつかのファイルnovel.txt
に適用したいと思います。 。
次に、magiccommand --magicflags dictionary.txt novel.txt
を実行します。 yes
のすべてのインスタンスが novel.txt
で no
に置き換えられます (つまり、Bayesian
Banoian
に置き換えられます )およびgoodbye
のすべてのインスタンス novel.txt
で hello
に置き換えられます など。
これまでのところ、私が置き換える(そして置き換える)必要のある文字列はしません 引用符(シングルでもダブルでもない)が含まれています。 (ただし、もちろん、引用符を含む文字列でソリューションがうまく機能するのを見るのは素晴らしいことです。)
sed
を知っています およびawk
/ gawk
主にそのようなことを行うことができますが、そのような辞書ファイルでも機能しますか? gawk
のようです magiccommand
の適切な候補になります 、正しいmagicflags
は何ですか ? dictionary.txt
をフォーマットするにはどうすればよいですか ?
承認された回答:
sed
を使用する1つの方法は次のとおりです :
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
dictionary.txt
になります スクリプトファイルに(編集コマンド、1行に1つずつ)。これは2番目のsed
にパイプされます (-f -
に注意してください これは、stdin
からコマンドを読み取ることを意味します )これらのコマンドを実行し、novel.txt
を編集します 。
これにはフォーマットの翻訳が必要です
"STRING" : "REPLACEMENT"
sed
に コマンドを実行し、両方のLHS
のプロセスで特殊文字をエスケープします およびRHS
:
s/ESCAPED_STRING/ESCAPED_REPLACEMENT/g
したがって、最初の置換
s|"(.*)"[[:blank:]]*:[[:blank:]]*"(.*)"|1
2|
"STRING" : "REPLACEMENT"
になります STRINGnREPLACEMENT
に (n
改行文字です)。結果はh
にコピーされます 古いスペース。s|.*n||
REPLACEMENT
のみを保持して最初の部分を削除します 次にs|[&/]|\&|g
予約文字をエスケープします(これはRHS
です )。
次にex
パターンスペースとs|n.*||
でホールドバッファを変更します STRING
のみを保持して2番目の部分を削除します およびs|[[.*^$/]|\&|g
エスケープを行います(これはLHS
です )。
次に、ホールドバッファの内容は、G
を介してパターンスペースに追加されます。 これで、パターンスペースのコンテンツはESCAPED_STRINGnESCAPED_REPLACEMENT
になります。 。
最後の置換
s|(.*)n(.*)|s/1/2/g|
それをs/ESCAPED_STRING/ESCAPED_REPLACEMENT/g
に変換します