使用字典替换字符串

Modified on: Sat, 30 Jun 2018 07:18:00 +0800

使用带有很多的substituend-substitution对的字典,在文件中进行字符串替换的好方法是什么?通过很多,我实际上意味着大约20个 - 不多,但足够多,所以我想整齐地组织它们。

我想以一种易于管理的方式收集文件dictionary.txt中的所有substituend-substitution对,因为我需要替换很多东西,比如:< / p>

"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将被hello等替换。

到目前为止,我需要替换(并替换为)而不是的字符串中包含任何引号(既不是单引号也不是双引号)。 (当然,看到解决方案适用于包含引号的字符串会很好。)

我知道sedawk / gawk主要可以做这些事情,但他们也可以使用这样的字典文件吗?似乎gawk将是magiccommand的正确候选者,什么是正确的magicflags?如何格式化dictionary.txt

作者:,k.stm

最佳答案

这是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

工作原理:
第一个seddictionary.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是换行符char)。然后将结果复制到h旧空间
s|.*\n||删除第一部分,仅保留REPLACEMENT,然后s|[\&amp;/]|\\&amp;|g转义保留字符(这是RHS
然后e x用模式空间更改保持缓冲区,s|\n.*||删除第二部分,只保留STRINGs|[[\.*^$/]|\\&amp;|g执行转义(这是LHS)。
然后通过G将保持缓冲区的内容附加到模式空间,现在模式空间内容为ESCAPED_STRING\nESCAPED_REPLACEMENT
最后的替换

s|\(.*\)\n\(.*\)|s/\1/\2/g|

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


相关问答

添加新评论