perl就地搜索和替换,但仅限于匹配第二个模式的行

时间:2015-10-29 22:05:13

标签: regex perl

今天我学会了如何使用perl在一个或多个文件中进行搜索和替换。例如,我可以这样做:

perl -i -p -e "s/Sydney/Moscow/g" cities.txt

...并且在完成之后,cities.txt将被就地修改,以便字符串"悉尼"的所有实例都被修改。已经被"莫斯科"取代。

这很棒,但我想要更多控制:具体来说,我希望搜索和替换操作仅在 的行上开始字符串" HomeCities:"

例如,如果cities.txt在运行命令之前看起来像这样:

HomeCities:   Dublin, Sydney, Los Angeles, Chicago
AwayCities:   New York, Melbourne, Sydney, Oakland

...然后在命令完成后,它看起来像这样:

HomeCities:   Dublin, Moscow, Los Angeles, Chicago
AwayCities:   New York, Melbourne, Sydney, Oakland

有没有办法在没有用明确的每行for-loop和per-line逻辑编写脚本或程序的情况下呢?

2 个答案:

答案 0 :(得分:5)

您只需添加if声明:

perl -i -p -e "s/Sydney/Moscow/g if /^HomeCities/" cities.txt

(请注意,在'cities.txt'文件'悉尼'拼写错误,因此不会进行替换

答案 1 :(得分:4)

你已经差不多了:

perl -i -p -e "s/Sydney/Moscow/g if /^HomeCities:/" cities.txt

编辑添加:

顺便提一下,文件可能包含一个名称中包含“悉尼”作为子串的城市,例如。 “悉尼维尔”或其他东西,你不想把它改成“莫斯科维尔”,你可以收紧正则表达式只适用于完整的单词:

perl -i -p -e "s/\bSydney\b/Moscow/g if /^HomeCities:/" cities.txt