除非前面有特定的字符集,否则删除新行

时间:2018-03-10 14:28:55

标签: regex bash perl sed regex-negation

如何在bash命令行中使用 Perl 和/或Sed删除新行但避免使用一组特定字符?

我最接近的是:

perl -C -i -p -e 's/[^.:]\n//' ~/Desktop/bak2

上面的代码在避免删除以点或冒号结尾的行方面效果很好,但是它很有意义,因为当删除正确的新行时,它也会删除字符串的最后一个字符。我还需要将删除的\ n替换为空格。

如果可能的话,由Perl和Sed提供此解决方案会很棒。 我已经在perl或sed中搜索了类似的解决方案,但我还没有找到它,如果确实存在则对不起。

示例:

现有内容:

  

紫罗兰是蓝色的

     布达有很好的教诲。

     

编程很简单,因为:

     

存在Stackoverflow,

     

社区总是帮助

     很多。

期望的输出:

  

紫罗兰是蓝色的,布达有很好的教诲。

     

编程很简单,因为:

     

Stackoverflow存在,社区总是帮助很多。

3 个答案:

答案 0 :(得分:0)

您可以保留新的前线匹配(我添加了“空”线处理):

perl -C -i -p -e 's/(^|[^.:])\n/$1/' ~/Desktop/bak2

或使用正面看法

perl -C -i -p -e 's/(?<=[^.:])\n//' ~/Desktop/bak2

答案 1 :(得分:0)

perl -i pe 's/[^.:]\K\n/ /' ~/Desktop/bak2

答案 2 :(得分:0)

使用sed

sed -e ':A;/[^.:]$/{N;bA' -e '};y/\n/ /' ~/Desktop/bak2

或gnu sed

sed -z 's/\([^.:]\)\n/\1 /g' ~/Desktop/bak2