括弧で始まり終わる文字列の正規表現

括弧で始まり終わる文字列の正規表現

infile.txt次の文字列を含むテキストファイルがあります。

[ A ]
1
2
[ B ]
3
[ C
4
5 
[ D ]

grep私は両方を使用してから始まり、終わる行を印刷したいと思いますsed。だから私が望む結果は次のとおりです。[]grepsed

[ A ]
[ B ]
[ D ]

現実の確認のために、まず次の行を印刷してみましょう[

grep "\[" infile.txt
grep -E "\[" infile.txt
sed -n '/\[/p' infile.txt
sed -nE '/\[/p' infile.txt

前のコマンドのそれぞれは、次の出力を提供します。

[ A ]
[ B ]
[ C
[ D ]

[これで、印刷された行が始まり終わる場所を指定する必要があります]この回答到着この問題正規表現を使用することをお勧めします\[[^\]]*\]。ただし、次のコマンドはすべて出力を提供しません(空の文字列)。

grep "\[[^\]]*\]" infile.txt
grep -E "\[[^\]]*\]" infile.txt
sed -n '/\[[^\]]*\]/p' infile.txt
sed -nE '/\[[^\]]*\]/p' infile.txt

しかし、次の各コマンドは...

grep "\[*\]" infile.txt
grep -E "\[*\]" infile.txt
sed -n '/\[*\]/p' infile.txt
sed -nE '/\[*\]/p' infile.txt

...必要な出力を提供します。

[ A ]
[ B ]
[ D ]

正規表現がそうでない理由\[[^\]]*\]- 繰り返しますが、この回答到着この問題- 私のテキストに合いますか?

答え1

grep -x '\[.*\]'

[()で始まり、()で終わる行を一致させるのに十分でなければなりません(その間に()文字()を]自由に含めます)。*.

-x実際には、^開始と終了に$暗黙の内容を追加するので、次のようになります。

grep '^\[.*\]$'

EREと同じかsed:

grep -xE '\[.*\]'
grep -E '^\[.*\]$'
sed '/^\[.*\]$/!d'
sed -n '/^\[.*\]$/p'
sed -E '/^\[.*\]$/!d'
sed -En '/^\[.*\]$/p'

あなたの:

\[[^\]]*\]

[a 後にバックスラッシュ以外の文字が続き、その後[^\]に任意の数の]文字が続き、その後に続きます]

後続のorを[除いて任意の数の文字を一致させるには、構文はorです。なぜならエスケープが必要ないからです。ただし、必要に応じてregexまたはglobスタイルを使用してこれをお勧めします。]]\[[^]]*\]\[[^]]*]]

[...]標準BREまたはERE(除外awk)では\特別なものはありません。しかし、特別な正規表現の変形があるので、[\\x]例えば[\x]、to match\またはx

正規表現はさまざまな形式で提供されます。その中にいる人https://regexr.com/あなたがリンクした回答に示すように、(一部のバージョンの)PCRE(perl互換正規表現)が表示されます。それらのいくつかは、角かっこ式をエスケープするために使用できるorおよびwhereを実装またはgrepサポートsedします。-P-R-x perl\]

また見なさい:私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?


1であり、現在POSIXの最新バージョンにあることが保証されていますが、これは明確な理由なく進行をブロックするため、将来変更される可能性があります。たとえば、TABで一致する環境ではない場合やPOSIXで要求されている場合など、一部の実装ではsedこの要件を無視することがわかります。または一致するにはポータブルを使用してください。$POSIXLY_CORRECT[\t]\t\t[\\t]

答え2

REをデコードしよう\[[^\]]*\]

  • \[- テキスト[文字
  • [^\]- いいえ\
  • ]- テキスト]文字
  • *- 前の項目が0回以上繰り返されます。つまり、]0回以上繰り返されます。
  • \]- 別のリテラル]文字(ここではバックスラッシュは無視されます)

これを適用すると、[ A ]一致しないことがわかります。私はあなたが尋ねる質問がなぜ[^\]]このようなことをするのか疑問に思います。負の記号には特別な場合があります^。次の記号が]文字通り処理されると、そうでなければ常に構造の終わりになります[...]

代わりにこのREを使用して、\[[^]*]文字列の前部と後部を固定することもできます。^\[.*]$

関連情報