从.txt文件中替换一行中的多个单词[重复]

Posted

技术标签:

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

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

两行的例子是

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

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

perl -lpe '
BEGIN 
    %re = (
        qphone number  => qphonenum,
        qphone no      => qphonenum,
        qaddr          => qaddress1,
        qaddress       => qaddress1,
    );
    $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 switchesperldoc perlre: Perl regular expressions (regexes)perldoc perlrequick: Perl regular expressions quick start

【讨论】:

它可能会根据评估的顺序将home address 转换为home address1ess @tshiono 感谢您指出正则表达式中的错误,例如,根据评估顺序,将home address 替换为home address1ess。通过添加\b 修复。 感谢您的更新。现在它工作正常!我已经 ++ed 为您提供了很好的答案。

以上是关于从.txt文件中替换一行中的多个单词[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Powershell 中一次替换多个 .txt 文件中的数据?

使用vim在多个文件中搜索和替换

正则表达式仅用替换文件中的单词替换单词

根据文本文件的名称查找和替换文本文件中的单词

编写一个字谜查找器(来自 txt 文件中的单词列表)[重复]

根据标志替换 .txt 文件中的行