たくさんの辞書を使用してファイル内の文字列を置き換える良い方法は何ですか 置換基-置換基のペアの?そしてたくさん 、私は実際には約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に変換します