Text-Processing

使用字典替換字元串

  • March 13, 2016

使用具有大量取代基-取代基對的字典在文件中進行字元串替換的好方法是什麼?很多,我實際上是指大約 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,以便 in 的所有實例yesnovel.txt被替換為no(所以 evenBayesian將被替換為Banoian),並且 in 的所有實例都goodbyenovel.txt被替換hello,依此類推。

到目前為止,我需要替換(和替換)的字元串中沒有任何引號(既不是單引號也不是雙引號)。(當然,很高興看到一個解決方案可以很好地處理包含引號的字元串。)

我知道sedawk/gawk主要可以做這樣的事情,但他們也可以使用這樣的字典文件嗎?似乎gawk是合適的人選magiccommand,什麼是合適的magicflags?我需要如何格式化我的dictionary.txt?

這是一種方法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變成dictionary.txt一個腳本文件(編輯命令,每行一個)。這通過管道傳輸到執行這些命令的第二個sed(注意-f -這意味著從 讀取命令stdin),編輯novel.txt.

這需要翻譯您的格式

"STRING"   :   "REPLACEMENT"

進入sed命令並轉義過程中的任何特殊字元LHSRHS

s/ESCAPED_STRING/ESCAPED_REPLACEMENT/g

所以第一個替換

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

變成(是換行符)"STRING" : "REPLACEMENT"。然後將結果復製到舊空間上。刪除保留的第一部分,然後轉義保留字元(這是)。 然後它使用模式空間更改保持緩衝區並刪除僅保留的第二部分並進行轉義(這是)。 然後將保持緩衝區的內容附加到模式空間,因此現在模式空間內容是. 最後換人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

引用自:https://unix.stackexchange.com/questions/269368