如何删除两个字符串之间的换行符\n在unix下?

如何删除两个字符串之间的换行符\n在unix下?

我想删除两个 html 标签之间的换行符,如下所示:

<font>
</font>

我想删除换行符,使其变为:

<font></font>

另外,在某些情况下可能会有多个换行符:

<font>

</font>

我也想删除它,使其看起来像:

<font></font>

又一个场景,

如果模式是这样的:

<font>
This is a text
</font>

转换后应该变成:

<font>This is a text</font>

如果我们只是截断,上述所有情况都可以解决仅有的两个 html 标签之间的换行符。我们不应该考虑任何空白。

我使用 sed 有几种方法可以找到它,但它非常耗时,而且性能非常高效,特别是当文件有 1000 多个 html 标签时。

答案1

这个sed命令应该可以帮助你:

sed -e ':1;/<font>[[:space:]]*$/{N;s#<font>[[:space:]]\+</font>#<font></font>#g;b1}' file

该命令正在查找<font>后面跟有空格直到行尾的标记。然后下一行被拉入模式空间;然后执行可能存在的序列的替换<font>[[:space:]]\+</font>,并且脚本从头开始重新启动。如果模式空间与地址不匹配/<font>[[:space:]]*$/,即标记后存在一些非空间内容<font>,则模式空间将被打印出来并由 清除,end of sed script并且进程重新启动。

编辑:性能测量。

我用以下内容填充了一个文件,重复了 10k 次:

<font>
dejidewji
</font>
<font>



</font><font>





</font>

总共 620Kb。上述脚本在 1.4Gz A8-4500M 上的时序为:

real    0m0.361s
user    0m0.356s
sys 0m0.005s

编辑2

您的最后一个问题更新更容易解决,perl并且性能提高了 10 倍,如其他答案所示:

perl -0777 -pe 's|<font>\s+|<font>|g;s|\s+</font>|</font>|g' file

致谢@spasic

答案2

$ cat ip.html
<font>
This is a text
</font>

123

<font>
</font>

xyz

<font>

</font>

ijk

<font>





</font>

789

perl解决方案,-0777吞掉整个文件

$ perl -0777 -pe 's|<font>\n*([^\n]*)\n*</font>|<font>$1</font>|g' ip.html
<font>This is a text</font>

123

<font></font>

xyz

<font></font>

ijk

<font></font>

789

相关内容