搜索并替换单行保留换行符

时间:2017-01-16 16:10:59

标签: regex perl

sample_file:

this is a test line!
this is a test line!
this is a test line!
this is a test line!

我使用Perl one-liner代替这样的文字:

perl -pi -e 's{this(.*)\s}{\n\1\n}i && s{.*\n}{}' sample_file

this(.*)\s部分和\1部分是可变的,我无法改变它(它来自用户输入)。

我的问题是我需要调整{\n\1\n}部分,具体取决于第一个正则表达式是否包含换行符。

例如,如果第一个正则表达式是{this(.*)\s},我需要{\n\1\n},但如果第一个正则表达式{(.*)a test}我需要{\n\1}

如何检查换行符是否丢失并在必要时将其放回?

1 个答案:

答案 0 :(得分:1)

一般来说,您希望chomp输入行,并为输出行添加换行符。 -l(与-n-p一起)将同时执行这两项操作。

例如,以下内容并未将换行符替换为!,因为它已被-l删除(随后由print重新添加)。

perl -i -ple's/\s/!/g' file

顺便说一句,\1("匹配第一次捕获的捕获")在替换中毫无意义。您想要$1(如-w所示)。