我需要做一些类似于这篇文章的事情(但有一点扭曲)。这就是我要问的原因。
unix shell: replace by dictionary
我有一本字典(dict.txt)。它是空格分隔的,它的内容如下:
V7 Momentum
B6 Quanta
...
(第一列是键,第二列是值,在某种意义上)
我有一个用户文件(user.txt),它包含键的出现(V7,B6等)。扭曲是键不在其自己的列中(因此上述帖子中的方法不适用)。
用户文件(user.txt)可以作为字符流查看。我只是想要替换所有出现的键(例如,V7),无论它们是由空格限制还是由其他字符限制,从字典中查找的值(Momentum)。
例如:
“我们将V7作为输入” - >应该改为 - > “我们有动力作为输入”
“我们有一些东西_7输入” - >应该更改为 - > “我们有一些Momentum_as输入”
答案 0 :(得分:9)
用法:awk -f foo.awk dict.dat user.dat
http://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
http://www.gnu.org/software/gawk/manual/html_node/Arrays.html
NR == FNR {
rep[$1] = $2
next
}
{
for (key in rep)
gsub(key, rep[key])
print
}
答案 1 :(得分:3)
只要你的字典键只包含字母数字字符,这个Perl就能满足您的需求。
use strict;
use warnings;
open my $fh, '<', 'dict.txt' or die $!;
my %dict = map { chomp; split ' ', $_, 2 } <$fh>;
my $re = join '|', keys %dict;
open $fh, '<', 'user.txt' or die $!;
while (<$fh>) {
s/($re)/$dict{$1}/g;
print;
}
答案 2 :(得分:2)
这可能适合你(GNU sed):
sed '/./!d;s/\([^ ]*\) *\(.*\)/\\|\1|s||\2|g/' dict.txt | sed -f - user.txt