从.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 文件中的数据?