【问题标题】:Remove new lines except when preceded by specific set of characters删除新行,除非前面有特定的字符集
【发布时间】:2018-08-18 23:51:35
【问题描述】:

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

我最接近的是:

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

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

如果可能的话,由 Perl 和 Sed 提供这个解决方案会很棒。 我在 perl 或 sed 中搜索过类似的解决方案,但没有找到,如果确实存在,请见谅。

例子:

现有内容:

紫罗兰是蓝色的

布达有很好的教导。

编程很容易,因为:

存在 Stackoverflow,

社区总是提供帮助

很多。

期望的输出:

紫罗兰是蓝色的,布达有伟大的教义。

编程很容易,因为:

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

【问题讨论】:

  • 请发布一些具有预期结果的示例数据。
  • 你肯定接受的答案没有输出预期的结果。
  • 是的,它起作用了,只是在替换部分添加了一个空格: perl -C -i -p -e 's/(?

标签: regex bash perl sed regex-negation


【解决方案1】:

使用 sed

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

或 gnu sed

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

【讨论】:

    【解决方案2】:
    perl -i pe 's/[^.:]\K\n/ /' ~/Desktop/bak2
    

    【讨论】:

      【解决方案3】:

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

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

      或使用正面的目光

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

      【讨论】:

      • 非常感谢,在替换部分添加空格后它起作用了: perl -C -i -p -e 's/(?
      • @Gabz 未将新行 ("\n") 替换为空格。你得到的并不比你要求的多:-)
      • 是的,我现在很抱歉,我在很多方面都是新手。但我很高兴能够学习。真的很感谢。
      猜你喜欢
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      相关资源
      最近更新 更多