替换文件中字符串对的快速方法

Fast way to substitute string pairs in file

我有一个包含 2 列的约 10,000 行的文件:

org_string1 \t replacement_string1
org_string2 \t replacement_string2

将所有这些 org_string 替换为另一个文本文件中相应的 replacement_string 的最佳方法 (speed/convenience) 是什么(在第二个文件中进行 10k 替换)?

我打算将它们转换为 sed 替换命令,但不确定速度性能以及它是否会超过 linux 中的最大命令行限制。

假设:

  1. 所有 org_string 和 replacement_string 都是唯一的。
  2. org_string 是输入文件中的单个单词(被 space 包围)。

这里有一个使用 Perl 的技巧可能会有所帮助:

my %map = (
    'the'   => 'a',
    'fox'   => 'frog',
    'jumps' => 'somersaults'
);

my $line = "the quick bown fox jumps over the lazy dog";

$line =~ s{\b(\w+)\b}{$map{} // }eg;

say $line;

此示例使用硬编码哈希映射 orig_strings 到 replacement_strings - 在您的情况下,您将通过读取映射对文件来填充此映射哈希。

然后正则表达式使用\b(\w+)\b捕获行中的每个单词并通过</code>传递给替换端。因为指定了 <code>/e 选项,所以替换的右侧被视为 Perl 表达式,表达式的计算结果是替换文本。 $map{} 使用原始单词作为映射哈希的键来查找替换文本。 // 部分是说如果哈希查找 returns undef (即没有替代这个词)那么只使用原始文本。

\w+部分将匹配一串单词或数字或下划线字符。您可能只需要字母字符,可能还需要撇号和连字符。为此,请使用 [a-zA-Z'-]+ 而不是 \w+

这应该非常快,因为每一行只有一个正则表达式 运行,并且每一行中的每个单词只有一个哈希查找。