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

Jer*_*ner 1 regex perl

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

perl -i -p -e "s/Sydney/Moscow/g" cities.txt
Run Code Online (Sandbox Code Playgroud)

...,然后完成操作,city.txt将被就地修改,这样字符串“ Sydney”的所有实例都将被“ Moscow”替换。

很好,但是我想更多地控制:特别是,我希望搜索和替换操作在以字符串“ HomeCities:”开头的行上发生

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

HomeCities:   Dublin, Sydney, Los Angeles, Chicago
AwayCities:   New York, Melbourne, Sydney, Oakland
Run Code Online (Sandbox Code Playgroud)

...然后在命令完成后,将如下所示:

HomeCities:   Dublin, Moscow, Los Angeles, Chicago
AwayCities:   New York, Melbourne, Sydney, Oakland
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以编写带有明确的每行for循环和每行逻辑的脚本或程序呢?

Sea*_*ean 6

你已经快到了:

perl -i -p -e "s/Sydney/Moscow/g if /^HomeCities:/" cities.txt
Run Code Online (Sandbox Code Playgroud)

编辑添加:

顺便说一句,如果文件可能包含名称中包含“悉尼”作为子字符串的城市,例如。“Sydneyville”或其他东西,并且您不想将其更改为“Moscowville”,您可以收紧正则表达式以仅适用于完整的单词:

perl -i -p -e "s/\bSydney\b/Moscow/g if /^HomeCities:/" cities.txt
Run Code Online (Sandbox Code Playgroud)


fug*_*ugu 5

您可以添加一条if语句:

perl -i -p -e "s/Sydney/Moscow/g if /^HomeCities/" cities.txt
Run Code Online (Sandbox Code Playgroud)

(请注意,在“ cities.txt”文件中,“悉尼”的拼写错误,因此将不会进行替换)