Tôi muốn ack cho chuỗi chữ: "$$
" trong một cơ sở mã, nhưng thoát các ký hiệu đô la như thế này:Làm cách nào tôi có thể tìm kiếm (thoát) một ký hiệu đô la bằng cách sử dụng ack?
ack \$\$
không hoạt động.
Tôi muốn ack cho chuỗi chữ: "$$
" trong một cơ sở mã, nhưng thoát các ký hiệu đô la như thế này:Làm cách nào tôi có thể tìm kiếm (thoát) một ký hiệu đô la bằng cách sử dụng ack?
ack \$\$
không hoạt động.
Bạn đang nhận được bối rối bằng cách trích dẫn vỏ. Khi bạn gõ:
ack "\\\$\\\$\("
vỏ nội suy chuỗi trích dẫn kép để \\
được phiên dịch sang \
, \$
được phiên dịch sang $
và \(
được phiên dịch sang \(
và ack được chuỗi \$\$\(
như là đối số của nó. Nó là đơn giản hơn nhiều để tránh những suy vỏ bằng cách sử dụng dấu nháy đơn và gọi:
ack '\$\$\('
Thay ack
với echo
để khám phá cách vỏ được mở rộng chuỗi. Lưu ý rằng
ack "\\$\\$\("
cũng sẽ hoạt động, nhưng vì các lý do hơi khác nhau. Ở đây, hai chữ cái đầu tiên \
được coi là một đơn (thoát) \
, thì $
được dịch là $
vì nó được theo sau bởi một ký tự không phải là ký tự hợp lệ trong tên biến. \(
mở rộng thành \(
thay vì chỉ đơn giản là (
vì (
không bị nội suy và do đó không cần phải thoát. Nhưng lưu ý rằng bên ngoài dấu ngoặc kép, \(
được chuyển đổi thành (
.
Quy tắc trích dẫn của đôi khi đôi khi gây nhầm lẫn!
vâng tôi bị lẫn lộn bởi quy tắc trích dẫn dễ dàng - mẹo lừa là một ý tưởng tuyệt vời mặc dù, nhờ chia sẻ –
Bạn có thể thoát khỏi nhân vật ký hiệu đô la với ba gạch chéo ngược, như thế này:
ack "\\\$\\\$"
hoặc sử dụng dấu nháy đơn, nơi bạn chỉ phải thoát khỏi nó một lần:
ack '\$\$'
Dễ dàng hơn khi sử dụng dấu nháy đơn: 'ack '\ $ \ $ \ ('' nên hoạt động tốt. –
Yup, tốt hơn nhiều - cảm ơn! –
Bạn có thể sử dụng printf
để xử lý báo giá cho bạn bằng cách sử dụng định dạng số %q
.
$ printf %q '$$('
\$\$\(
help print
có (bash Tôi giả định ở đây) sau đây để nói `
%q quote the argument in a way that can be reused as shell input
'ack '[$] [$]''. Lớp nhân vật. Sạch hơn N thoát. –