我想删除两个 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