2

次のようなファイルがあります。

expression1
- expresson1.1
- expressoion1.2
expression2
-expression2.1
expression3
-expression3.1
-expression3.2
-expression3.3

私がやりたいのは、行 1.2、3.2、および 3.3 を削除して、マイナスで始まらない行だけを削除し、次の行を残すことです。

そこで、マイナスで始まるすべての行に一致する正規表現を書いてみましたが、前の行もマイナスで始まり、それらを削除しました。

これまでのところ、成功はありません。どんなヒントでも大歓迎です。

4

3 に答える 3

1

次の正規表現を使用できます。

/(-.+)\s((-.+)?(\s|))+/g

一致を次のものに置き換えます。

$1\n

この正規表現が RegExr hereで実際に動作しているのを見ることができます。

PS の難しい問題です。照合する固定長のプレフィックスがないため、ルックアラウンドは機能しませんが、後読み (および先読み)には、ここ(ページの最後の近く) で指摘されているように固定長の文字列が必要です。

于 2012-09-26T10:42:29.133 に答える
1

awk ソリューションが受け入れられる場合は、以下のワンライナーを確認してください。

awk '/^[^-]/{f=1;print;next;}{if(f && $0~/^-/){print;f=0;}}' yourFile

テスト

kent$  echo "expression1
dquote> - expresson1.1
dquote> - expressoion1.2
dquote> expression2
dquote> -expression2.1
dquote> expression3
dquote> -expression3.1
dquote> -expression3.2
dquote> -expression3.3
dquote> "|awk '/^[^-]/{f=1;print;next;}{if(f && $0~/^-/){print;f=0;}}'
expression1
- expresson1.1
expression2
-expression2.1
expression3
-expression3.1
于 2012-09-26T09:34:52.773 に答える
0

正規表現のフレーバーによっては、マルチラインモードをアクティブにする方法がおそらくあります。この場合、文字列全体の開始と終了に加えて、行の開始と終了を一致させます^$

/^-.*$\n((^-.*$\n?)+)/

これは、で始まる少なくとも2つの連続した行と一致する必要があり-ます。最初のキャプチャ/サブパターンには、最初の行の後のすべての行が含まれます。したがって、これらの一致は削除したいものになります。

もちろん、\nシステムに適した行末に置き換えてください。

于 2012-09-26T09:41:36.853 に答える