【问题标题】:Replace multiple words in one line from a .txt file [duplicate]从.txt文件中替换一行中的多个单词[重复]
【发布时间】:2021-02-01 19:15:18
【问题描述】:

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

两行的例子是

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

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

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

谢谢!

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    使用 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 :在执行内联代码之前剥离输入行分隔符(默认情况下 *NIX 上为 "\n"),并在打印时附加它。

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

    s/\b($re_str)\b/$re{$1}/g;$re_str 周围的括号将模式捕获到 $1 变量中。 \b 表示分词,即单词的开头或结尾。需要添加\b 以防止将home address 替换为home address1ess,具体取决于评估顺序。

    另请参阅:
    perldoc perlrun: how to execute the Perl interpreter: command line switches
    perldoc perlre: Perl regular expressions (regexes)
    perldoc perlrequick: Perl regular expressions quick start

    【讨论】:

    • 它可能会根据评估的顺序将home address 转换为home address1ess
    • @tshiono 感谢您指出正则表达式中的错误,例如,根据评估顺序,将home address 替换为home address1ess。通过添加\b 修复。
    • 感谢您的更新。现在它工作正常!我已经 ++ed 为您提供了很好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多