我有一个文本文件mytext.txt,文本的每一行都是一个句子:
the quick brown fox jumps over the lazy dog
colorless green ideas sleep furiously
然后我有一个字典文件 dict.txt,如下所示:
the: A
quick: B
brown: C
fox: D
jumps: E
over: F
lazy: G
dog: H
colorless: I
green: J
ideas: K
sleep: L
furiously: M
我想用 dict.txt 中的值替换 mytext.txt 中的每个单词,如下所示:
A B C D E F A G H
I J K L M
如何使用 awk 或 sed 来完成此操作?
最佳答案
如果你的 dict.txt 没有任何特殊字符,一个非常快速的解决方案是将 dict.txt 的内容转换为 sed 表达式:
sed 's#^#s/#;s#: #/#;s#$#/g;#' dict.txt
将导致
s/the/A/g;
s/quick/B/g;
s/brown/C/g;
s/fox/D/g;
s/jumps/E/g;
s/over/F/g;
s/lazy/G/g;
s/dog/H/g;
s/colorless/I/g;
s/green/J/g;
s/ideas/K/g;
s/sleep/L/g;
s/furiously/M/g;
现在这可以用于另一个 sed:
sed -f <(sed 's#^#s/#;s#: #/#;s#$#/g;#' dict.txt) mytext.txt
输出:
A B C D E F A G H
I J K L M
但请注意 dict 文件是否包含 sed 特有的任何字符 /
\
.
*
a.s.o.它不会起作用
编辑:添加了g
到 sed
更新:
如果只替换整个单词,这就能解决问题,因为 \b
将寻找单词边界:
sed -f <(sed 's#^#s/\\b#;s#: #\\b/#;s#$#/g;#' dict.txt) mytext.txt
谢谢@jm666 指出了这一点。
编辑2:
如果 dict.txt 文件很长,我的原始版本可能会失败。
@SLePort 的版本修复了这个问题,谢谢。
我以前用过"$()"
而不是-f <()
关于linux - 将文件中的每个单词替换为另一个字典文件中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42983982/