我使用 (示例) 进行了大量文本清理,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
在读取1
st 行之后需要进行附加操作。
笔记:
使用
-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`