単語全体をgrepする方法


87

次のコマンドを使用して、サブディレクトリにあるものをgrepします

find . | xargs grep -s 's:text'

しかし、これは次のようなものも見つけます <s:textfield name="sdfsf"...../>

それを回避するために何ができるので、次のようなものが見つかります <s:text name="sdfsdf"/>

またはそのことについては....また見つける <s:text somethingElse="lkjkj" name="lkkj"

基本的にs:textname同じ行にある必要があります。


29
タイトルを「全世界をgrepする方法」と読んだ人はいますか?
アールズ2010年

15
@Earlz、いいえ、主に私が「grep全単語」をグーグルで検索したからです。
ルーク

回答:


104

あなたは欲しい-wオプションは、それは言葉の終わりだということを指定します。

find . | xargs grep -sw 's:text'


71

使用\bだけ単語全体で検索マッチを行います「単語の境界」、にマッチします。

したがって、grepは次のようになります

grep -r "\bSTRING\b"

色と行番号を追加することも役立つかもしれません

grep --color -rn "\bSTRING\b"

http://www.regular-expressions.info/wordboundaries.htmlから:

単語の境界として適格な3つの異なる位置があります。

  • 文字列の最初の文字の前。最初の文字が単語文字の場合。
  • 文字列の最後の文字の後、最後の文字が単語文字の場合。
  • 文字列内の2つの文字の間。一方は単語文字で、もう一方は単語文字ではありません。

28

xargsgrep検索を再帰的に行うことで、コマンドを削除できます。また、通常は「s」フラグは必要ありません。したがって:

grep -wr 's:text' 

1

rgを試すことができます、https//github.com/BurntSushi/ripgrep

rg -w 's:text' . 

それをする必要があります


このリンクは質問に答えることができますが、ここに答えの本質的な部分を含めて、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。-レビューから
Jibin Balachandran 2017年

4
私は答えを提供しました:rg -w's:text '。
ms4720 2017年

1
非標準のツールを提案する理由は他にもあるかもしれませんが、これを標準で解決する方法に関する質問の解決策として、grepこれは特に説得力がなく、満足できるものではありません。特にgrep同じオプションがある場合はそうです。
トリプリー

ダイレクトの深さと太さによって異なります
ms47

ファイルの数によって異なりますが、ripgrepの方がはるかに高速で、find-> xargsによってファイルごとに新しいプロセスが作成されます。
ms47 2019年

0

残りのテキスト部分を除外したいだけの場合は、これを行うことができます。

xargs grep -s 's:text '

これによりs:text、最後のtの後にスペースがあるインスタンスのみが検索されます。s:textname要素のみを持つインスタンスを見つける必要がある場合は、結果を別のgrep式にパイプするか、正規表現を使用して必要な要素のみをフィルタリングします。


「テキスト」が出力の最後にある場合はどうなりますか?ソリューションでスキップされませんか?
pkuszewski 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.