2016-09-22 10 views
1

ファイル内に空白で囲まれた単語を見つける必要がありました。grepのどの空白が最も良い標準ですか?

ファイル、上記の単語の間にあるtest.txt

head target_word tail 

スペースがタブすることができます。 試しました

grep -e '\starget_word\s' test.txt 

「target_word」が見つかりませんでした。しかし

grep -e "[[:space:]]target_word[[:space:]]" test.txt 

grep -e "[ \t]target_word[ \t]" test.txt 

がうまく働いています。

どのホワイトスペースが最も受け入れられますか?私にお知らせください。

+2

'\ s'がPCREの場合、' -P'フラグを使用する必要があります。'[[:space:]]'はposixなので、もっとも移植性が高いので、最も受け入れられると思われるものがあります。 – 123

答えて

3

スペースまたはタブに一致する場合は、[[:blank:]]を使用できます。これは、ロケールの設定に関係なく、スペースまたはタブとして定義されます。 the POSIX specから

:POSIXロケールで

、唯一<space><tab>を含めなければなりません。

ロケール定義ファイルでは、<space>および<tab>が自動的にこのクラスに含まれます。

[[:space:]]でも使用できますが、スペースやタブに加えて他の文字が含まれています。

+0

良い答え!.... – hek2mgl

+0

@Tom Fenech:grepのマニュアルで「空白」という単語を検索できなかったため、grepで[[:blank:]]を使うことができませんでした。さらに、あなたの答えは私に彼らの違いを知らせてくれます。ありがとうございました。 – mora

0

cat test.txt | grep " target_word "でもお試しいただけます。

なお、catは必要ありません。 grep " target_word " test.txtの方がはるかに優れています。

+0

これはどのようにして質問に答えますか? – 123

+0

@ Varun M:Varun Mありがとうございます.test.txt内のスペースはタブにすることができます。私はそれを表現しなかった。申し訳ありません。例を単純化してくれてありがとう。 – mora

+1

@ 123、grep検索にスペースを明示的に含めることができることを示したかったのです。 – VM17

1

ロケールに応じて任意の種類の空白に一致させる場合は、[[:space:]]を使用してください。 Cロケールでは、タブ、改行、垂直タブ、改ページ、改行、およびスペースが一致します。ただし、ロケールの設定によっては、そのロケールのスペースと見なされる追加の文字と一致することがあります。

1

あなたは、具体的\t<space>)の状態にしたい場合は、あなたがすることができます

$ cat > target.txt 
head target_word tail       # space-separated 
head target_word  tail     # tab-separated 
$ grep $'[\t ]target' target.txt 
head target_word tail 
head target_word  tail 

編集

\tgrepについて:

grep
$ cat > test 
1 1  # space-delimited 
2  2 # tab-delimited 
$ grep \t test 
$ grep '\t' test 
$ grep "\t" test 
$ grep $'\t' test 
2  2 
$ grep -V 
grep (GNU grep) 2.16 
# - - 

使っていますか?鉱山は\tで動作しません。

+0

@TomFenech私の編集を参照してください。 –

+0

私が言ったことを取り戻します.Cスタイルの文字列を使用しない場合は、リテラルタブ文字が必要です。 –

関連する問題