今天我学习了如何使用 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/