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\\"
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\\"
Câu trả lời:
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 printf
thay vì echo
nhiều cách echo
triể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 \b
thà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\\bar
dướ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à \
vẫn còn nhân vật hoạt động trong phạm vi "…"
.
Bạn cũng có thể sử dụng fgrep
(chỉ grep
với -F
cờ). Đ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\'
..\
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
grep
yê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\\\\"
grep
chỉ 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.
grep '\\resources\\'