web-dev-qa-db-ja.com

先行スペースを含むgrepパターン

Grepの正しいパターンを設定するには、助けが必要です。 patternのすべてのオカレンスを見つける必要があります。ここで、行持っている可能性がある先行スペース。例:次のファイル:

 1. No pattern recognized.
 2. Pattern to be recognized
 3.          Pattern to be recognized here also
 4.  pattern with only one leading space 

行2、3、および4のみをgrepします。行番号は参照用です。

これまでのところ、私は次のことを試しました:

grep -i '^ [[:blank:]]pattern'、ただし4行目のみを返します。

grep -i '[[:blank:]]pattern'は1,3および4を返します。

grep -i '^[[:blank:]]pattern'は1,3および4を返します。

-マイクP.S.これが適切なフォーラムでない場合は、それに応じてご案内ください。

2
Mike V.D.C.

2行目と3行目は大文字のPであり、0個以上のスペースが必要なので、次のことを正確に指定します。

$ grep '[[:blank:]]*Pattern'  input.txt                                  
 Pattern to be recognized
         Pattern to be recognized here also

個人的には、'[[:blank:]]Pattern.*recognized'のような他の何かでパターンを拡張することをお勧めします

2

私が得たのは、行2のように先頭のスペースがまったくないか、1つ以上のスペースがあることです。これは、スペースが1つある行4を除外するためです。

だから私は提案する:

egrep -i '^\s*pattern' file.txt | grep -v '^\spattern'

または、単一のawkを使用します。

awk 'tolower($0) ~ /^\s*pattern/ && !/^\spattern/ ' file.txt
  • \sスペースとして、必要に応じてblankで変更できます。
  • egrep -i '^\s*pattern' file.txt最初に、パターンの後に続くスペースの有無にかかわらず、すべての行を開始します。
  • grep -v '^\spattern':次に、先頭のスペースが1つだけ含まれているものを除外します。

上記の例は、番号付けのないファイルで機能します。ファイルに先頭の番号が含まれている場合は、これを使用します。

egrep -i '\s*pattern' file.txt | grep -v '\spattern'

またはawkの場合:

awk 'tolower($0) ~ /\s*pattern/ && !/\spattern/ ' file.txt
2
Ravexina