30

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

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

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

現在のすべてのテキスト

次のすべてに置き換えます。


2011年冬のクラススケジュール

2011年冬のクラス登録日:2010年12月6日〜2011年1月1日
2011年冬のクラスセッション日程:2011年1月5日〜2月12日

ダンス

バレエ&タップの冒険      
3〜6年インストラクター:アン・ニュービー
3〜6歳のトットは、動きの基本的な要素を探求するにつれて、リズム、柔軟性、協調性の感覚が高まります。
土曜日9-10am1月8日-2月12日6週間の料金:$ 30


アフリカのストーリーテリング
3〜6年インストラクター:アン・ニュービー
3〜6歳のトットは、話し言葉、音楽、動き、視覚芸術の体験を通じて、ストーリーテリングと寓話を探求します。
土曜日10– 11 am 1月8日– 2月12日6週間の料金:$ 30


アフリカンダンス/子供

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

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

現在のすべてのテキスト

次のすべてに置き換えます。

2011年冬のクラススケジュール

2011年冬のクラス登録日:2010年12月6日〜2011年1月1日
2011年冬のクラスセッション日程:2011年1月5日〜2月12日

ダンス

バレエ&タップの冒険      
3〜6年インストラクター:アン・ニュービー
3〜6歳のトットは、動きの基本的な要素を探求するにつれて、リズム、柔軟性、協調性の感覚が高まります。
土曜日9-10am1月8日-2月12日6週間の料金:$ 30

アフリカのストーリーテリング
3〜6年インストラクター:アン・ニュービー
3〜6歳のトットは、話し言葉、音楽、動き、視覚芸術の体験を通じて、ストーリーテリングと寓話を探求します。
土曜日10– 11 am 1月8日– 2月12日6週間の料金:$ 30

アフリカンダンス/子供
4

10 に答える 10

40

交換する

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

\r\n

私が終わったものです。

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

于 2010-12-17T23:27:03.787 に答える
21

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

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

\n\n

于 2010-12-17T21:54:42.363 に答える
5

この perl onelinerperl -00pe0を試してください。その場で編集したい場合は、-iオプションを追加してください

于 2014-01-21T03:48:36.510 に答える
4

完全を期すために、ここで参照したいのは、UltraEdit のユーザー フォーラムにある大きな投稿Remove / delete blank and empty linesです。これには、初心者向けのすべての説明の後に、何もない (空の行) または空白だけの 2 つ以上の行を減らすための解決策が含まれています。 (空白行) 行末記号の種類に依存しない 1 つの空白行に。

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

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

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

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

段落の最後にオプションで末尾のスペースとタブがある行末 (1 行以上) と、段落の下に空白行がない (空行) または空白がある (空白行) 2 行以上の行は、検索文字列\h*(\r?\n|\r)(?:\h*\1){2,}\1\1置換として実行できます。ストリング。

説明:

\h*Unicode 0 回以上の水平空白文字に一致します。検索式のこの最初の部分は、水平タブ、通常のスペース、改行なしスペース、その他のあまり使用されないスペースなど、行末の水平空白文字に一致します。

この文字クラスは、垂直空白文字のキャリッジ リターンやライン フィードを含む任意の空白文字に一致するため、の使用は適切ではありません。\s

(\r?\n|\r)... は、マーキング グループに 2 つの引数を持つOR式です。最初の引数は改行と前の改行に一致し、2 番目の引数は改行のみに一致します。したがって、この表現は、一般的な 3 つのタイプの回線終端すべてに完全に一致します。残りの検索と置換では、常にCR+LF (両方を一緒に)またはLFまたはCRのみに一致することが重要です。

(?:\h*\1)... は、0 個以上の水平空白文字と、CR+LFまたはLFまたはCRだけで後方参照される前に見つかった改行に一致する非マーキング グループです。したがって、式のこの部分は空行または空白行を検出します。\1

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

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

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

{2,}+この Perl 正規表現の置換を実行する際に、段落の末尾および次の空行または空白行の空白も削除する必要がある場合は、検索文字列でに置き換えることができます。ただし、この場合、置換は、段落の末尾に空白がなく、次の行が空の行である場合、何も変更しない置換を行うことに注意してください。

于 2014-01-21T06:56:00.007 に答える
4

交換する

\n\s*\n\s* 

\n\n

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

于 2010-12-17T22:04:24.340 に答える
3

Vim では、

:%!cat -s

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

于 2012-11-21T04:59:19.380 に答える
0

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

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

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

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

于 2010-12-18T04:47:16.160 に答える
0

空白行のスペースでも動作するはずです

  • 検索 - /\n^\s*\n/
  • 置換 - \n\n
于 2011-08-26T18:00:46.797 に答える
0

「置換」領域で UltraEdit が何を回避できるかはわかりませんが、改行を使用できない場合 (以前にこの問題がありました)、キャプチャ参照を使用できる場合は、これでうまくいく可能性があります。

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

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

于 2010-12-17T22:06:24.980 に答える