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

标签 regex perl

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

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

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

这很好,但我想要更多控制:具体来说,我希望搜索和替换操作发生在以字符串“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 循环和每行逻辑编写脚本或程序之外,有没有办法做到这一点?

最佳答案

你已经差不多了:

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

编辑添加:

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

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

关于regex - perl 就地搜索和替换,但仅在匹配第二个模式的行上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33425448/

相关文章:

linux - 如何使用unix在数据库中登录和执行命令?

mysql - 优化在 JOIN 中使用 REGEXP 的 SQL 查询

python - 如何在python中使用带有可选字符的正则表达式?

python - 匹配字符串时捕获前n个词

regex - 正则表达式到行尾

perl - 在 Perl 中使用 OLE 遍历 Outlook 文件夹

regex - 从c文件中提取标题名称的正则表达式

与 PostgreSQL 的 Perl DBI 连接不会因数据库错误而终止()

perl - 像我一样使用 selectall_hashref

linux - Perl脚本: Removing self deplicate rows