2016-04-12 4 views
0

特定のパターンに該当しないすべての線をファイルから抽出したい。Bash - 特定のパターンを含まないファイルからの線の取得

pattern="tmp/[...]/include/linux/*.h" 
file contains: 
17937;/home/[...]/tmp/[...]/include/linux/header.h;484;16;[Other text here] 
37417;/home/[...]/tmp/[...]/src/file.cpp;1851;41;[Other text here] 
17945;/home/[...]/tmp/[...]/include/linux/*/header.h;484;16;[Other text here] 

期待される結果は2行目のみです。

は私が怒鳴るラインを試みたと私は、ファイルの内容全体を取得:

grep -E -v $pattern file 

それだけ怒鳴るラインで動作しますが、それは十分ではありません。

grep -E -v .h file 

方法希望の出力を得ることができますか?

+2

grep -E -v "tmp /\\​​...\\]/ include/linux /.* \ .h"は、あなたのデータに基づいて望ましい結果を得ます。 – sigmalha

+0

除外する行を決定するパターンが固定されているか、ワイルドカードを使用しているような場合はわかりません:* .h - >拡張子が.hのすべてのファイルを除外します。 – MarcM

+0

ワイルドカードのような感じです。そのパターンを含むすべての行が除外されます(同じ場所にあるすべての.h行)。 –

答えて

1

あなたの正規表現は[]間の文字のリストを有する「これらの文字のいずれかと一致」を意味するので"tmp/\[\.\.\.]/include/linux/.*\.h"

  • 最初の正方形のブラケットは、エスケープする必要になっている必要があります。
  • ワイルドカードはそれに先行する文字に関連付けられているため、任意の文字に一致させるために前にドットを置く必要があります。
  • あなたがそれらにマッチしたい場合、あなたはドットをエスケープする必要があります。そうしないと、どんな文字にもマッチします。
+1

を参照してください。最初の角括弧をエスケープすることも重要です。 POSIXのreg ex manのマニュアル: 'man re_format'の' bracket expression'の節を参照してください。 –

+0

そうですね、これもまた忘れてしまいました。ありがとうございます。 – Sylvain

関連する問題