替换多个文件中的双换行符

替换多个文件中的双换行符

我使用 (示例) 进行了大量文本清理,perl -p -i -e 's:old:new:g;' *.txt但当 old 为\n\n而 new 为时\n</p><p>\n,没有任何变化。尝试转义尖括号,但这没有帮助。

一个可以容忍的替代方案是perl -p -i -e 's:(.*):<p>\1</p>:g;' s:<p></p>::g;*.txt`,但最好将标签放在文本之间的空白行上。

不一定是 perl,但我熟悉的大多数其他语言都需要编译和链接。

答案1

解决方案

sed '1 N
:start;N;s#\n\n#\n</p><p>\n#;t start;P;D'

“NPD”方案在这是我的另一个答案。在您的情况下,我们需要使用 3 行窗口而不是 2 行窗口,因此N在读取1st 行之后需要进行附加操作。

笔记:

  • 使用-i如果你愿意的话。代码可能像这样:

    sed -i.bak '…
    …' *.txt
    
  • 在 *nix 中,任何非空文本文件的末尾都应该有一个换行符。由于 中的模式空间sed不包含尾随换行符,因此在我们的“NPD”方案中,换行符只能出现在我们使用的 3 行窗口的中间。这意味着如果文件末尾有两个换行符,则它们不会被替换。换句话说,最后一个换行符无法按字面意思匹配。


例子

输入:

1
2
3

4


5

输出:

1
2
3
</p><p>
4
</p><p>
</p><p>
5

答案2

我认为您想匹配空行并在其中放入一些标签。

那么这将起作用:

perl -p -i -e 's:^$:</p><p>:g;' *.txt

如果您甚至想将空行与空格匹配,您可以将其放在中间而^$无需进行其他更改。

答案3

你的一句话

perl -p -i -e 's:\n\n:\n</p><p>\n:g;' *.txt

每次读取一行,那么它永远不会在一行中找到 2 个换行符。

您必须激活“slurp 模式”,即重新定义记录分隔符。
通常我们使用undef $/;或在一行中使用选项-0777

然后你的一行变成:

perl -0777 -i.back -pe 's:(?<=\n)(?=\n):</p><p>:g' *.txt`

相关内容