2012-03-31 14 views
1

正規表現を含むいくつかの操作を行う必要があります。私が上で動作してい正規表現 - 文字クラス内で短い文字を使用する

文字列:

/dev/fd0  /media/floppy0 auto rw,us 

は基本的に、私は何をしたい最初の2つのパラメータ(/dev/fd0/media/floppy0)に乗り、私は、この後のすべてを無視したいです。達成するために、以下に示す正規表現を試しました。私の質問は、次の正規表現ではなぜ異なる結果が生じるのでしょうか?

正規表現1:

grep -o '/dev/f\S*\s*\S*' /etc/fstab 

出力(私は期待していた出力):

/dev/fd0  /media/floppy0 

正規表現2:

grep -o '/dev/f[\S]*\s*[\S]*' /etc/fstab 

出力:

/dev/f 

正規表現3:

grep -o '/dev/f[^\s]*\s[^\s]*' /etc/fstab 

出力:2と3を1として、私はそれを見る方法は同じ出力を生成しない理由

/dev/fd0  /media/floppy0 auto rw,u 

私は見ていないがためにということです2では、文字クラスの中に空白以外の短い文字(\S)を入れるかどうかは関係ありません。 3と同じです。さらに、なぜ3と2が違うのですか? [\S][^\s]と同じですか?

答えて

2

私は、彼らはあなたの解釈が—正しいが、POSIX基本正規表現(BREでは、grepがデフォルトで使用する正規表現型)になり、多くの正規表現エンジンがある—異なる場合が「必要がある」かどうかに話すことができないと思います[\S]は、\Sを含む文字クラスであり、[^\s]は、\sを除くすべての文字を含む文字クラスです。 (これは、BREとEREの両方で必要な仕様に従います。「特殊文字'.''*''['、および'\'(それぞれピリオド、アスタリスク、左括弧、バックスラッシュ)は、ブラケット表現「[link])内文字クラス\sの同等[:space:]です。

grep -o '/dev/f[^[:space:]]*\s*[^[:space:]]*' /etc/fstab 

grepの一部のバージョンではなく、POSIXのPerl互換の正規表現(PCREs)を使用する非標準-Pオプションをサポート正規表現。 Perl互換の正規表現にはあなたが記述する振る舞いがあるので、grepがそのオプションをサポートしている場合は、次のように使用できます。

grep -o -P '/dev/f[\S]*\s*[\S]*' /etc/fstab 
grep -o -P grep -o '/dev/f[^\s]*\s[^\s]*' /etc/fstab 
+0

素晴らしい!説明ありがとう。 – kpatelio

+0

@ user600194:ようこそ! – ruakh

関連する問題