2016-09-09 11 views
2

私はLinuxのbashのログファイルからテキストをgrepしようとしています。テキストは大括弧で囲まれています。bash grep text角括弧内

in:

32432423 jkhkjh [234] hkjh32 2342342 

私は234を検索しています。

は通常、それはそれは

\[(.*?)\] 

ではなく、あなたが開きブラケットを探すことができますgrepの

+0

括弧は必要ありません。または疑問符。 –

+0

grep \\ [。* \\]のような意味ですか?私は赤い帽子のLinuxで動作しませんでした – user3732793

+0

私は 'エコーを試したとき32432423 jkhkjh [234] hkjh32 2342342" | grep '\ [。* \]' '私のDebianシステムでうまく動作しているようです。それは '[234]'部分と一致しました。 –

答えて

4

と正規表現検索を行うための正しい方法を何であるか

|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オプションでのみ機能します。

+1

優れた答え、説明のおかげで! – user3732793

1

[はシェルgrepの両方に特別な意味を持っているので、あなたはそれが二回引用する必要があります。バックスラッシュは、grepがブラケット式の一部としてそれらを扱うのを防ぎます。全体を引用すると、シェルは正規表現をパターンとして展開してからgrepに渡すことを防ぎます。彼らは文字通り、それらを治療するためのシェルを強制的にした後、あなたの試みで

... | grep '\[(.*?)\]' 

は、シェルは、バックスラッシュを剥奪それが... | grep '[(.*?)]'に約でした。

0

私は(それはです。:\\[ [ ^] ]* ]、すなわち何-が、右平方括弧角括弧内\\[[^]]*]を好むので、貪欲の\\[.*]以上:

$ 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 

すなわち。 括弧で置換されたものとすべてのもの...