bash - 从 .txt 文件中替换一行中的多个单词
问题描述
我正在尝试替换 txt 文件中的多个单词。
有两行的例子是
phone number: 123 addr: xyz
phone no: 456 home address: abc
假设我想用phonenum替换“电话号码”和“电话号码”,用address1替换“addr”和“address” 。
目前我只知道如何通过运行多个 sed 命令来做到这一点,我正在寻找一些指导以找到更有效的方法。
谢谢!
解决方案
使用 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 正则表达式快速入门
推荐阅读
- python - 我如何使用布尔表达式作为 True 和 False 来使用我的 if else 条件
- php - PHP数组生成
- mysql - Jasync vertx 库连接池不起作用
- c# - 反转一个单词,但得到奇怪的输出
- android - 重新排序游标数据
- java - 如何从 IntelliJ 终端按 ESC 退出 JFrame?
- javascript - 是否可以从数组中删除重复的对象,在 Javascript 中使用过滤器方法
- php - PHP数组在foreach中找到相同的值
- angular - 不能在 Angular 路由中使用枚举
- php - 从webview下载pdf,pdf以blob格式存储在mysql DB中