首页 > 解决方案 > 从 .txt 文件中替换一行中的多个单词

问题描述

我正在尝试替换 txt 文件中的多个单词。

有两行的例子是

phone number: 123 addr: xyz
phone no: 456 home address: abc 

假设我想用phonenum替换“电话号码”和“电话号码”,用address1替换“addr”和“address” 。

目前我只知道如何通过运行多个 sed 命令来做到这一点,我正在寻找一些指导以找到更有效的方法。

谢谢!

标签: bashawksed

解决方案


使用 Perl,散列的键是要替换的单词,值是它们想要的替换。连接在管道上的键字符串用作替换运算符中的模式s///g,使用/g修饰符可以在每行中启用多个替换。

echo "phone number: 123 addr: xyz\nphone no: 456 home address: abc" > in.txt

perl -lpe '
BEGIN {
    %re = (
        q{phone number}  => q{phonenum},
        q{phone no}      => q{phonenum},
        q{addr}          => q{address1},
        q{address}       => q{address1},
    );
    $re_str = join q{|}, keys %re; # "phone number|phone no|addr|address"
}
s/\b($re_str)\b/$re{$1}/g;
' in.txt > out.txt

文件中的输出out.txt

phonenum: 123 address1: xyz
phonenum: 456 home address1: abc

Perl 单行器使用这些命令行标志:
-e:告诉 Perl 查找内联代码,而不是在文件中。
-p:一次循环输入一行,$_默认情况下将其分配给。print $_在每次循环迭代后添加。
-l: 在执行内联代码之前去除输入行分隔符("\n"默认情况下在 *NIX 上),并在打印时附加它。

q{...}:指定单引号字符串的另一种方法('...'此处未使用,因为它们必须在单引号 Perl 单行中进行转义)。

s/\b($re_str)\b/$re{$1}/g;: 括号$re_str将模式捕获到$1变量中。\b表示分词,即单词的开头或结尾。需要添加\b以防止替换,例如,根据评估顺序,home address用,。home address1ess

还请参见
perldoc perlrun::如何执行 Perl 解释器:命令行开关
perldoc perlre:Perl 正则表达式(正则表达式)
perldoc perlrequick:Perl 正则表达式快速入门


推荐阅读