web-dev-qa-db-ja.com

正規表現の検索と置換を使用して、複数の空白行を1つの空白行に置き換える

「余分な」空白行を再フォーマットして削除する必要があるファイルがあります。

UltraEditのPerl構文の正規表現検索および置換機能を使用しており、「FindWhat:」フィールドに正規表現を入力する必要があります。

これが私が再フォーマットする必要があるファイルのサンプルです。

現在のすべてのテキスト
 
次のすべてに置き換えます:
 
 
 2011年冬のクラススケジュール
 
 2011年冬のクラス登録日:2010年12月6日– 2011年1月1日
 2011年冬のクラスセッション日:2011年1月5日– 2月12日
 
ダンス
 
バレエ&タップの冒険
 3〜6歳インストラクター:アンニュービー
 3〜6歳の幼児は、リズム、柔軟性、動きの基本的な要素を探求する際の調整。
 1月8日から2月12日までの土曜日午前9時から10時6週間の料金:30ドル
 
 
アフリカのストーリーテリング
 3〜6歳インストラクター:アンニュービー
 3〜6歳のトットは、話し言葉、音楽、動き、視覚芸術の体験を通じて、ストーリーテリングと寓話を探求します。
土曜日10〜11 1月8日〜2月12日午前6週間の料金:$ 30 
 
 
アフリカンダンス/子供

一部の二重空白行には、スペースまたはタブ、あるいはその両方が含まれていることに気付くでしょう。

検索と置換が実行された後、次のようなファイルが作成されます。

現在のすべてのテキスト
 
次のすべてに置き換えます:
 
 2011年冬のクラススケジュール
 
 2011年冬クラス登録日:2010年12月6日– 2011年1月1日
 2011年冬クラスセッション日:2011年1月5日– 2月12日
 
ダンス
 
 Ballet&Tapの冒険
 3 – 6年インストラクター:Ann Newby 
 3 – 6歳の幼児は、探求するにつれて、リズム、柔軟性、調整の感覚が高まります。動きの基本要素。
 1月8日から2月12日までの土曜日午前9時から10時6週間の料金:30ドル
 
アフリカンストーリーテリング
 3〜6年インストラクター:アンニュービー
 3〜6歳のトットは、話し言葉、音楽、動き、視覚芸術の体験を通じてストーリーテリングと寓話を探求します。
土曜日10 – 11 am 1月8日– 2月12日6日-週料金:$ 30 
 
アフリカンダンス/子供
26
Art

交換

^(\ s *\r\n){2、}

\ r\n

私が最終的に得たものです。

これは、2つ以上の倍数の空白行のみを選択し、それらを1つに置き換えます。

34
Art

行末が何であるかによります。\nと仮定して、これを置き換えます。

([ \t]*\n){3,}

\n\n

20
Mark Byers

交換

\n\s*\n\s* 

\n\n

トリックを行う必要があります

3
killdash9

このPerlワンライナーPerl -00pe0を試してください。インプレース編集が必要な場合は、-iオプションを追加するだけです。

3
Ask and Learn

Vimでは、

:%!cat -s

これまでのところ、余分な空の行を削除する最も簡単な方法だと思います。

3
coanor

完全を期すために、ここで大きな投稿を参照したいと思います 空白行と空行を削除/削除 UltraEditのユーザーフォーラムの下部に、初心者向けのすべての説明の後に、何もせずに2行以上を減らすためのソリューションが含まれています(空の行)または空白(空白行)だけで、行末記号のタイプに関係なく1つの空の行になります。

そして、アラン・ムーアが彼の答えに書いたことについてのいくつかの言葉:

UltraEditのPerl正規表現のサポートは、その行ベースのアーキテクチャによって損なわれていません。 Perl正規表現エンジンには、ドットがキャリッジリターン(CR)やラインフィード(LF)などの改行文字を除くすべての文字と一致するか、実際にはCRとLFを含むすべての文字と一致するかを決定するフラグがあります。これにより、テキストファイルが大きなバイトストリームとして解釈される場合、またはPerl正規表現の検索/置換の一連の行として解釈される場合に違いが生じます。 UltraEditでは、フラグはデフォルトで設定されており、正規表現の検索文字列にドットで_\r_(CR)と_\n_(LF)が含まれていません。ただし、この動作は、正規表現文字列を_(?s)_で開始することにより、UltraEditで簡単に変更できます。これにより、Perlのトピック "。"でUltraEditユーザーフォーラムに投稿されたフラグ_match_not_dot_newline_の値が変更されます。正規表現にはCRLFが含まれていませんか?

Perl正規表現は、ファイルの動作を次のように置き換えます。

  • キャリッジリターン+ラインフィード(DOS/Windows)または
  • 改行のみ(Unix、Mac OS 10.0以降のバージョン)または
  • キャリッジリターンのみ(Mac OS 9以前のバージョン)

as 行末 段落の終わりにオプションで末尾のスペースとタブがあり(1行以上)、段落の下に空白がない(空の行)または空白がある(空白行)2行以上の場合があります検索文字列\h*(\r?\n|\r)(?:\h*\1){2,}および_\1\1_を置換文字列として使用して実行されます。

説明:

_\h*_一致任意の水平方向の空白 Unicodeに準拠した文字回以上。検索式のこの最初の部分は、水平タブ、通常のスペース、ノーブレークスペース、その他のあまり使用されないスペースなど、行末の水平空白文字と一致します。

_\s_の使用法は、この文字クラスが垂直空白文字のキャリッジリターンや改行を含むすべての空白文字と一致するため、適切ではありません。

_(\r?\n|\r)_...は[〜#〜]または[〜#〜]式であり、マーキンググループに2つの引数があります。最初の引数は、オプションで先行するキャリッジリターンを使用して改行と一致し、2番目の引数はキャリッジリターンのみと一致します。したがって、この式は、3つの一般的なタイプの回線終端すべてに完全に一致します。検索と置換の残りの部分が常に一致することが重要ですCR + LF(両方一緒に)またはちょうどLFまたはCRのみ

_(?:\h*\1)_...は非マーキンググループであり、個以上の水平方向の空白および改行に一致します。 _\1_、つまりCR + LFまたはちょうどLFまたはCRだけ。したがって、式のこの部分は空または空白行を見つけます。

_{2,}_ ...は、非マーキンググループの前の式の乗数であり、少なくとも2回を意味します。したがって、段落の終わりの後には、2つ以上の空行または空白行が必要です。段落の下の1行または空白行だけでは、検索式の正の一致には不十分です。

置換文字列_\1\1_は、最初に見つかった改行の2倍を参照します。

ここに掲載されている他の正規表現と比較した場合のこの正規表現の利点は、行末の型がわからないことです。検索式は、out andfound行末が置換文字列で参照されていることを検出します。また、段落の下に2つ以上の空行または空白行がある場合は、この正規表現replaceによって、段落の終わりにある既存の末尾の空白と次の行の空白も削除される可能性があります。

このPerl正規表現replaceの実行時に段落の終わりと次の空行または空白行の空白のトリミングも行う必要がある場合は、検索文字列で_{2,}_を_+_に置き換えることができます。ただし、この場合、段落の終わりに末尾の空白がなく、次の行が空の行である場合、replaceはreplaceを作成し、何も変更しないことに注意してください。

3
Mofi

問題の原因については、 このスレッド を参照してください。私が理解しているように、UltraEdit正規表現は、文字レベル(つまり、行内)では貪欲ですが、行レベル(大まかに言えば)では貪欲ではありません。 UEにアクセスできませんが、正規表現を書いてみます。具体的なものと一致する必要がありますafter最後の空白行。例えば:

search:   (\r\n[ \t]*){2,}(\S)
replace:  $1$2

これは、行区切り文字の2つ以上のインスタンスとそれに続く水平方向の空白を照合してキャプチャしますが、最後のインスタンスのみ保持です。 \Sは、少なくとも1つの非空白文字を含む行が見つかるまで、強制的に一致を維持する必要があります。

私はこのソリューションにあまり自信がないことを認めます。 UltraEditの正規表現のサポートは、そのラインベースのアーキテクチャによって機能しなくなります。正規表現を実行するエディターが必要で、rightで、まったく新しい正規表現構文(vimのような)を学びたくない場合は、 EditPadPro を取得します。

0
Alan Moore

UltraEditで「置換」領域を回避できるかどうかはわかりませんが、改行を使用できない場合(以前にこの問題が発生したことがあります)、canキャプチャ参照を使用すると、作業:

Find    : \s*(\r\n)\s*(\r\n)\s*\r\n
Replace : $1$2

広範囲にテストされていませんが、提供されたサンプルで機能するようです。

0
Dave Mateer

空白行のスペースでも機能するはずです

  • 検索-/\n ^\s *\n /
  • 置換-\ n\n
0
Ninad

私の場合Intellij IDE\n\nを検索し、それを\nに置き換えました

0
Tiago Gouvêa