4

我需要做一些与这篇文章类似的事情(但有所不同)。这就是我问的原因。

Unix shell:用字典替换

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

V7 动量

B6广达

……

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

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

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

例如:

“我们有 V7 作为输入”--> 应该更改为-->“我们有 Momentum 作为输入”

“我们有 somethingV7_as 输入”--> 应该更改为 --> “我们有 somethingMomentum_as 输入”

4

3 回答 3

10

用法: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
}
于 2012-07-26T22:44:06.240 回答
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;
}
于 2012-07-27T00:01:23.633 回答
3

这可能对您有用(GNU sed):

sed '/./!d;s/\([^ ]*\) *\(.*\)/\\|\1|s||\2|g/' dict.txt | sed -f - user.txt
于 2012-07-27T06:43:50.847 回答