使用字典替换字符串

k.s*_*stm 8 sed awk text-processing gawk

使用包含大量替换词-替换词对的字典在文件中进行字符串替换的好方法是什么?而到了很多,我实际上意味着约20 -并不多,但许多足以使我想整齐地组织起来。

我有点想以dictionary.txt一种易于管理的方式在一个文件中收集所有替代物-替代物对,因为我需要替换很多东西,比如:

"yes"      : "no"
"stop"     : "go, go, go!"
"wee-ooo"  : "ooooh nooo!"
"gooodbye" : "hello"

"high"     : "low"
"why?"     : "i don't know"
Run Code Online (Sandbox Code Playgroud)

现在我想在一些文件中应用这些替换novel.txt

然后我想运行,magiccommand --magicflags dictionary.txt novel.txt以便yesin 的所有实例novel.txt都被替换no(因此甚至Bayesian会被替换为Banoian),并且所有的goodbyein实例都novel.txt将被替换为hello等等。

到目前为止,我需要替换(和替换)的字符串中没有任何引号(单引号或双引号)。(当然,看到一个解决方案可以很好地处理包含引号的字符串会很好。)

我知道sed并且awk/gawk主要可以做这样的事情,但是他们也可以使用这样的字典文件吗?似乎gawk是合适的人选magiccommand,什么是合适的magicflags?我需要如何格式化我的dictionary.txt?

don*_*sti 3

这是一种方法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
Run Code Online (Sandbox Code Playgroud)

它是如何工作的:
第一个sed变成dictionary.txt一个脚本文件(编辑命令,每行一个)。这通过管道传输到执行这些命令的第二个sed(注意,这-f -意味着从 读取命令stdin),编辑novel.txt
这需要翻译您的格式

"STRING"   :   "REPLACEMENT"
Run Code Online (Sandbox Code Playgroud)

进入sed命令并转义过程中的所有特殊字符LHSRHS

s/ESCAPED_STRING/ESCAPED_REPLACEMENT/g
Run Code Online (Sandbox Code Playgroud)

所以第一次替换

s|"\(.*\)"[[:blank:]]*:[[:blank:]]*"\(.*\)"|\1\
\2|
Run Code Online (Sandbox Code Playgroud)

变成("STRING" : "REPLACEMENT"是换行符)。然后将结果复制到旧空间。删除第一部分,仅保留然后转义保留字符(这是)。 然后,它使用模式空间更改保持缓冲区,并删除仅保留的第二部分并进行转义(这是)。 然后,保持缓冲区的内容通过 附加到模式空间,因此现在模式空间内容为。 最终换人STRING\nREPLACEMENT\nh
s|.*\n||REPLACEMENTs|[\&/]|\\&|gRHS
xs|\n.*||STRINGs|[[\.*^$/]|\\&|gLHS
GESCAPED_STRING\nESCAPED_REPLACEMENT

s|\(.*\)\n\(.*\)|s/\1/\2/g|
Run Code Online (Sandbox Code Playgroud)

将其转化为s/ESCAPED_STRING/ESCAPED_REPLACEMENT/g