GNU/Linux >> Linux の 問題 >  >> Linux

辞書を使用した文字列の置換?

たくさんの辞書を使用してファイル内の文字列を置き換える良い方法は何ですか 置換基-置換基のペアの?そしてたくさん 、私は実際には約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.txtnoに置き換えられます (つまり、Bayesian Banoianに置き換えられます )およびgoodbyeのすべてのインスタンス novel.txthelloに置き換えられます など。

これまでのところ、私が置き換える(そして置き換える)必要のある文字列はしません 引用符(シングルでもダブルでもない)が含まれています。 (ただし、もちろん、引用符を含む文字列でソリューションがうまく機能するのを見るのは素晴らしいことです。)

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に変換します


Linux
  1. .htaccessファイルを使用してerror-log.txtログを有効にする方法は?

  2. 変数を使用してBashを使用して複数行の文字列を記述する方法は?

  3. grep を使用してドットを含む文字列を検索する

  1. SedでBash文字列変数への参照を使用しますか?

  2. Linuxを使用して行に存在する文字列の長さを制限する方法

  3. リモート マシンが Windows と Linux のどちらを使用しているかを確認するにはどうすればよいですか?

  1. Sedを使用して文字列の最初の文字をラップしますか?

  2. Sedを使用して、一致する文字列のN番目の位置に文字を追加しますか?

  3. ヌル文字列を使用して個々の文字を分割しますか?