搜索和替换一个班轮保留换行符

问题描述:

sample_file:搜索和替换一个班轮保留换行符

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

我使用一个Perl的一行来代替文字是这样的:

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}

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

+0

它不会在第一个地方工作 - ''-pi'会导致你的东西逐行迭代。 – Sobrique

+0

你从错误的地方开始,你的问题是误导。我建议你问另一个问题,显示你已经尝试过的内容,并描述你想要应用到你的文件的转换。 – Borodin

+0

你真的不应该要求你的用户输入正则表达式模式! – Borodin

一般而言,您要输入chomp行,并在输出行中添加换行符。 -l(与-n-p一起)将同时做到这两点。

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

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

顺便说一句,\1(“匹配的内容捕获的第一捕获”)使得替换没有任何意义。你想要$1(因为-w会告诉你)。

+0

谢谢,基本上-l解决了我的问题! – zjeraar