infile.txt
次の文字列を含むテキストファイルがあります。
[ A ]
1
2
[ B ]
3
[ C
4
5
[ D ]
grep
私は両方を使用してから始まり、終わる行を印刷したいと思いますsed
。だから私が望む結果は次のとおりです。[
]
grep
sed
[ 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を使用して、\[[^]*]
文字列の前部と後部を固定することもできます。^\[.*]$