私はLinuxのbashのログファイルからテキストをgrepしようとしています。テキストは大括弧で囲まれています。bash grep text角括弧内
in:
32432423 jkhkjh [234] hkjh32 2342342
私は234
を検索しています。
は通常、それはそれは
\[(.*?)\]
ではなく、あなたが開きブラケットを探すことができますgrepの
私はLinuxのbashのログファイルからテキストをgrepしようとしています。テキストは大括弧で囲まれています。bash grep text角括弧内
in:
32432423 jkhkjh [234] hkjh32 2342342
私は234
を検索しています。
は通常、それはそれは
\[(.*?)\]
ではなく、あなたが開きブラケットを探すことができますgrepの
と正規表現検索を行うための正しい方法を何であるか
|grep \[(.*?)\]
を見つける必要があります\K
エスケープシーケンスでクリアします。その後、閉じ括弧まで一致:あなたが言って(Perlの正規表現を拡張)-P
を省略することができます
$ grep -Po '\[\K[^]]*' <<< "32432423 jkhkjh [234] hkjh32 2342342"
234
注:あなたが見るように
$ grep -o '\[.*]' <<< "32432423 jkhkjh [234] hkjh32 2342342"
[234]
はしかし、これはまた、ブラケットを出力します。だから、裏返しと後見を行うには-P
が有益です。
また、?
は正規表現に記載されています。あなたがすでに知っているように、*?
は正規表現の一致を非貪欲な方法で行うことです。 [23]4]
で、それは[23]
に一致し、.*?
で
$ grep -Po '\[.*?]' <<< "32432423 jkhkjh [23]4] hkjh32 2342342"
[23]
$ grep -Po '\[.*]' <<< "32432423 jkhkjh [23]4] hkjh32 2342342"
[23]4]
:のは例を見てみましょう。 .*
の場合は、最後の]
まで一致し、[23]4]
となります。この動作は、-P
オプションでのみ機能します。
優れた答え、説明のおかげで! – user3732793
[
はシェルとgrep
の両方に特別な意味を持っているので、あなたはそれが二回引用する必要があります。バックスラッシュは、grep
がブラケット式の一部としてそれらを扱うのを防ぎます。全体を引用すると、シェルは正規表現をパターンとして展開してからgrep
に渡すことを防ぎます。彼らは文字通り、それらを治療するためのシェルを強制的にした後、あなたの試みで
... | grep '\[(.*?)\]'
は、シェルは、バックスラッシュを剥奪それが... | grep '[(.*?)]'
に約でした。
私は(それはです。:\\[ [ ^] ]* ]
、すなわち何-が、右平方括弧角括弧内)\\[[^]]*]
を好むので、貪欲の\\[.*]
以上:
$ grep -o \\[.*] <<<"[this] and that too]"
[this] and that too]
対
$ grep -o \\[[^]]*] <<<"[this] and that too]"
[this]
また、grep
はすべてのツールではありません(結局g/re/p
)。あなただけの角括弧内に何したい場合、私は、そのためのsed
を使用したい:
$ sed 's/.*\[\([^]]*\)].*/\1/' foo
234
すなわち。 括弧で置換されたものとすべてのもの...。
括弧は必要ありません。または疑問符。 –
grep \\ [。* \\]のような意味ですか?私は赤い帽子のLinuxで動作しませんでした – user3732793
私は 'エコーを試したとき32432423 jkhkjh [234] hkjh32 2342342" | grep '\ [。* \]' '私のDebianシステムでうまく動作しているようです。それは '[234]'部分と一致しました。 –