grep: dấu gạch chéo ngược


23

Tôi muốn làm một grep cho \resources\. Làm thế nào để tôi làm điều này?

Tôi đã thử:

grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"

Không ai trong số này làm việc .


5
Sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép để tránh giải thích dấu gạch chéo ngược của bash. grep '\\resources\\'
Paul Tomblin

Câu trả lời:


27

Dấu gạch chéo ngược là một ký tự đặc biệt cho nhiều ứng dụng:

  • bao gồm cả vỏ: bạn cần thoát nó bằng cách sử dụng dấu gạch chéo ngược khác hoặc thanh lịch hơn, sử dụng dấu ngoặc đơn khi có thể:

    $ printf '%s\n' foo\\bar 'foo\bar'
    foo\bar
    foo\bar
    

    Ở đây, lệnh nhận được hai đối số có giá trị foo\bar, được lặp lại như là trên thiết bị đầu cuối.

    (Ở trên, tôi đã sử dụng printfthay vì echonhiều cách echotriển khai cũng thực hiện việc diễn giải dấu gạch chéo ngược của riêng họ (ở đây sẽ mở rộng \bthành một ký tự backspace)).

  • Nhưng dấu gạch chéo ngược cũng là một ký tự đặc biệt cho grep. Lệnh này nhận rất nhiều cảnh quay đặc biệt như \(, \|, \., và vân vân. Vì vậy, tương tự như vậy, bạn cần cung cấp grep với gấp đôi \\cho một ký tự dấu gạch chéo ngược thực tế. Điều này có nghĩa là sử dụng shell bạn cần gõ:

    grep 'foo\\bar'
    

    hoặc tương đương:

    grep foo\\\\bar
    

    (cả hai dòng nói với shell để truyền foo\\bardưới dạng đối số grep).

  • Nhiều lệnh khác diễn giải dấu gạch chéo ngược trong một số đối số của họ, và hai mức thoát là cần thiết (một để thoát khỏi giải thích shell, một để thoát khỏi việc giải thích lệnh).


Bằng cách này, cho vỏ, dấu nháy đơn '…'ngăn chặn bất kỳ loại giải thích nhân vật, nhưng dấu ngoặc kép chỉ ngăn một số trong số họ: nói riêng $, `\vẫn còn nhân vật hoạt động trong phạm vi "…".


18

Bạn cũng có thể sử dụng fgrep(chỉ grepvới -Fcờ). Điều này buộc grep phải diễn giải mô hình như một chuỗi cố định (nghĩa là nó sẽ coi \một chuỗi theo nghĩa đen \). Bạn vẫn sẽ cần bảo vệ dấu gạch chéo ngược khỏi sự mở rộng của vỏ.

grep -F '\resources\'

Lá cờ là có lý do! Tôi đã cố gắng grep cho ..\và thậm chí với '..\\'tôi đã không nhận được kết quả tôi muốn. grep -F '..\'đã cho tôi những gì tôi muốn! Cảm ơn
FreeSoftwareServers

.. Hãy thử định dạng nhận xét đó một cách chính xác! -> meta.stackexchange.com/questions/201663/ trên
FreeSoftwareServers

3

grepyêu cầu bốn dấu gạch chéo ngược để thể hiện dấu gạch chéo ngược:

grep "\\\\resources\\\\"

12
Đây là một sự đơn giản hóa quá sai lầm. grepchỉ yêu cầu 1 dấu gạch chéo ngược để thoát dấu gạch chéo ngược khác, nhưng trình bao cũng yêu cầu dấu gạch chéo ngược được trích dẫn. Dấu ngoặc kép ( ") KHÔNG trích dẫn dấu gạch chéo ngược, nhưng dấu gạch chéo ngược có, đó là lý do tại sao dấu ngoặc kép trong ví dụ của bạn không làm gì và thay vào đó là 4 dấu gạch chéo ngược.
jw013

Tôi đã phải sử dụng bốn dấu gạch chéo ngược trong Windows mặc dù dấu nhắc lệnh của Windows không xử lý dấu gạch chéo ngược như * nix. Tôi tự hỏi nếu các cổng GnuWin hiểu sai về hiệu ứng của vỏ và mã hóa cứng một yêu cầu 4 gạch chéo, nghĩ rằng đó là những gì được yêu cầu bởi grep.
Synetech
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.