linux - 将文件中的每个单词替换为另一个字典文件中的值

标签 linux shell awk sed grep

我有一个文本文件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/

相关文章:

linux - 如何按列值分组到行和列标题中,然后对值求和

bash - 在 shell 脚本中嵌入 awk

linux - 如何使用 image magick 编写将图像切割成碎片的 bash 脚本?

bash - ff探针 |展架 |数据包大小 |划分 |添加

c - 免费 `mmap()-ed` 私有(private)大页面

bash - 如何打印文件中包含指定字节偏移量的整行?

Linux:创建随机目录/文件层次结构

shell - openshift 命令以编程方式/脚本捕获 POD 名称

linux - 可执行代码到底是什么?

c++ - 有什么方法可以将 EGL 绘制到/dev/fb1 而不是/dev/fb0 而无需在 Raspberry Pi 上复制数据?