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
以便yes
in 的所有实例novel.txt
都被替换no
(因此甚至Bayesian
会被替换为Banoian
),并且所有的goodbye
in实例都novel.txt
将被替换为hello
等等。
到目前为止,我需要替换(和替换)的字符串中没有任何引号(单引号或双引号)。(当然,看到一个解决方案可以很好地处理包含引号的字符串会很好。)
我知道sed
并且awk
/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
Run Code Online (Sandbox Code Playgroud)
它是如何工作的:
第一个sed
变成dictionary.txt
一个脚本文件(编辑命令,每行一个)。这通过管道传输到执行这些命令的第二个sed
(注意,这-f -
意味着从 读取命令stdin
),编辑novel.txt
。
这需要翻译您的格式
"STRING" : "REPLACEMENT"
Run Code Online (Sandbox Code Playgroud)
进入sed
命令并转义过程中的所有特殊字符LHS
和RHS
:
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
\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|
Run Code Online (Sandbox Code Playgroud)
将其转化为s/ESCAPED_STRING/ESCAPED_REPLACEMENT/g