【发布时间】:2017-02-10 11:04:03
【问题描述】:
我正在尝试使用 perl 单行代码来更新一些跨越多行的代码,并且看到了一些奇怪的行为。这是一个简单的文本文件,显示了我看到的问题:
ABCD START
STOP EFGH
我预计以下内容会起作用,但它最终不会取代任何东西:
perl -pi -e 's/START\s+STOP/REPLACE/s' input.txt
在做了一些实验后,我发现原始正则表达式中的 \s+ 将匹配换行符,但不匹配第二行的任何空格,并且添加第二个 \s+ 也不起作用。所以现在我正在做以下解决方法,即添加一个只删除换行符的中间正则表达式:
perl -pi -e 's/START\s+/START/s' input.txt
这将创建以下中间文件:
ABCD START STOP EFGH
然后我可以运行原始的正则表达式(尽管不再需要 /s):
perl -pi -e 's/START\s+STOP/REPLACE/s' input.txt
这将创建最终的所需文件:
ABCD REPLACE EFGH
似乎不需要中间步骤。我错过了什么吗?
【问题讨论】:
-
您的常见问题在第一句话中就得到了回答:“perldoc -q match” --> “我在匹配多行时遇到问题。怎么了?”
-
/s只影响.匹配的内容,因此不需要您的/ss