次のように、2つのhtmlタグの間にある改行文字を削除したいと思います。
<font>
</font>
改行文字を削除して次のようにしたいと思います。
<font></font>
また、場合によっては複数の改行がある場合があります。
<font>
</font>
また、次のように削除したいと思います。
<font></font>
別のシーン、
パターンが次の場合:
<font>
This is a text
</font>
変換後は次のようになります。
<font>This is a text</font>
上記のすべての場合は、切り取るだけで解決できます。ただ2つの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
プロセスが再開されます。
編集する:性能測定。
私は次の内容でファイルを埋め、10,000回繰り返しました。
<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