根据字典替换文本

时间:2012-07-26 22:25:52

标签: linux perl unix sed awk

我需要做一些类似于这篇文章的事情(但有一点扭曲)。这就是我要问的原因。

unix shell: replace by dictionary

我有一本字典(dict.txt)。它是空格分隔的,它的内容如下:

V7 Momentum

B6 Quanta

...

(第一列是键,第二列是值,在某种意义上)

我有一个用户文件(user.txt),它包含键的出现(V7,B6等)。扭曲是键不在其自己的列中(因此上述帖子中的方法不适用)。

用户文件(user.txt)可以作为字符流查看。我只是想要替换所有出现的键(例如,V7),无论它们是由空格限制还是由其他字符限制,从字典中查找的值(Momentum)。

例如:

“我们将V7作为输入” - >应该改为 - > “我们有动力作为输入”

“我们有一些东西_7输入” - >应该更改为 - > “我们有一些Momentum_as输入”

3 个答案:

答案 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