2つの文字列間の改行文字を削除する方法\NUnixでは?

2つの文字列間の改行文字を削除する方法\NUnixでは?

次のように、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

関連情報