今天我学会了如何使用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逻辑编写脚本或程序的情况下呢?
答案 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