Làm thế nào để grep cho toàn bộ từ


82

Tôi đang sử dụng lệnh sau để grep nội dung trong các subdirs

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

Tuy nhiên, điều này cũng tìm thấy những thứ như <s:textfield name="sdfsf"...../>

Tôi có thể làm gì để tránh điều đó để nó chỉ tìm thấy những thứ như <s:text name="sdfsdf"/>

HOẶC cho vấn đề đó .... cũng tìm thấy <s:text somethingElse="lkjkj" name="lkkj"

về cơ bản s:textnamephải nằm trên cùng một dòng ....


29
Có ai đọc tiêu đề là "cách để grep cho cả thế giới " không?
Earlz

14
@Earlz, không, chủ yếu là vì tôi đã tìm kiếm "toàn bộ từ" trên Google.
Luke

Câu trả lời:


99

Bạn muốn -wtùy chọn chỉ định rằng đó là phần cuối của một từ.

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


66

Sử dụng \bđể đối sánh trên "ranh giới từ", điều này sẽ giúp tìm kiếm của bạn chỉ đối sánh trên toàn bộ các từ.

Vì vậy, grep của bạn sẽ trông giống như

grep -r "\bSTRING\b"

thêm màu và số dòng cũng có thể hữu ích

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

Từ http://www.regular-expressions.info/wordboundaries.html :

Có ba vị trí khác nhau đủ điều kiện làm ranh giới từ:

  • Trước ký tự đầu tiên trong chuỗi, nếu ký tự đầu tiên là ký tự từ.
  • Sau ký tự cuối cùng trong chuỗi, nếu ký tự cuối cùng là ký tự từ.
  • Giữa hai ký tự trong chuỗi, trong đó một ký tự là từ và ký tự kia không phải là ký tự từ.

28

Bạn có thể bỏ xargslệnh bằng cách thực hiện tìm kiếm đệ quy grep. Và bạn thường không cần cờ 's'. Vì thế:

grep -wr 's:text' 

1

bạn có thể thử rg, https://github.com/BurntSushi/ripgrep :

rg -w 's:text' . 

Hãy làm nó


Mặc dù liên kết này có thể trả lời câu hỏi, nhưng tốt hơn hết bạn nên đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo. Các câu trả lời chỉ có liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. - Từ xét
Jibin Balachandran

3
Tôi đã cung cấp câu trả lời: rg -w 's: text'.
ms4720,

1
Có thể có những lý do khác để đề xuất một công cụ không tiêu chuẩn, nhưng như một giải pháp cho câu hỏi về cách giải quyết vấn đề này với tiêu chuẩn, grepđiều này không đặc biệt thuyết phục hoặc thỏa mãn, đặc biệt là khi grepcó cùng một lựa chọn.
tripleee

Nó phụ thuộc vào cách sâu sắc và chất béo của Directi
ms4720

Nó phụ thuộc vào số lượng tệp, ripgrep có thể nhanh hơn nhiều và find-> xargs tạo ra một quy trình mới cho mỗi tệp.
ms4720,

0

Nếu bạn chỉ muốn lọc ra phần văn bản còn lại, bạn có thể làm điều này.

xargs grep -s 's:text '

Điều này sẽ chỉ tìm thấy các s:texttrường hợp có khoảng trắng sau t cuối cùng. Nếu bạn cần tìm các s:texttrường hợp chỉ có phần tử tên, hãy chuyển kết quả của bạn sang một grepbiểu thức khác hoặc sử dụng regex để chỉ lọc các phần tử bạn cần.


điều gì sẽ xảy ra nếu "văn bản" ở cuối đầu ra? Nó sẽ không bị bỏ qua trong giải pháp của bạn chứ?
pkuszewski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.