Làm cách nào tôi có thể grep cho một chuỗi bắt đầu bằng dấu gạch ngang / dấu gạch nối?


347

Tôi muốn grep cho chuỗi bắt đầu bằng dấu gạch ngang / dấu gạch nối, như -X, trong một tệp, nhưng nó gây nhầm lẫn đây là một đối số dòng lệnh.

Tôi đã thử:

grep "-X"
grep \-X
grep '-X'

Câu trả lời:


465

Sử dụng:

grep -- -X

Liên quan: một dấu gạch ngang đôi có nghĩa là gì? (nhờ vào nutty về natty ).


57
Đối với những người trong chúng ta tự hỏi ở giai đoạn này --có nghĩa là gì hoặc không: unix.stackexchange.com/questions/11376/ Ấn
nutty về natty

2
Hoạt động với The Silver Searcher (ag) là tốt.
Zev Eisenberg

Nếu bạn muốn sử dụng với biến có không gian, bạn nên sử dụng một cái gì đó như thế này:ARGS="-a -b -c" grep -- "$ARGS"
zapstar 16/12/14

2
@zapstar Hoặc chỉ , grep -- "--name awesome".
Brett Widmeier

@BrettWidmeier, vâng, tôi không nên sử dụng biến, nó làm mọi người bối rối.
zapstar

57

Dấu gạch ngang là một ký tự đặc biệt trong Bash như được ghi chú tại http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Vì vậy, thoát khỏi điều này một lần giúp bạn vượt qua Bash, nhưng Grep vẫn có ý nghĩa riêng với dấu gạch ngang (bằng cách cung cấp tùy chọn).

Vì vậy, bạn thực sự cần phải thoát nó hai lần (nếu bạn không muốn sử dụng các câu trả lời được đề cập khác). Sau đây sẽ / nên làm việc

grep \\-X
grep '\-X'
grep "\-X"

Một cách để thử cách Bash chuyển các đối số cho một tập lệnh / chương trình là tạo một tập lệnh .sh chỉ lặp lại tất cả các đối số. Thỉnh thoảng tôi sử dụng một tập lệnh có tên là echo-args.sh để chơi, tất cả những gì nó chứa là:

echo $*

Tôi gọi nó là:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

Bạn có được ý tưởng.


1
Tôi không nghĩ - là một nhân vật đặc biệt trong Bash bất chấp những gì hướng dẫn của ABS nói. Bash không xử lý các đối số bắt đầu bằng - bất kỳ khác biệt so với những người khác. Lệnh hoặc lệnh tích hợp mà Bash gọi sau đó sẽ xử lý các đối số bắt đầu bằng dấu gạch ngang tuy nhiên nó thấy phù hợp. Hầu hết các lệnh dựng sẵn của Bash và các lệnh Linux và GNU đều xử lý - như một bộ kết thúc tùy chọn. Sử dụng 'set -x' để xem các lệnh và đối số mà Bash sử dụng trước khi chúng được thực thi, nhưng sau khi Bash đã mở rộng các lối thoát, các khối và dấu ngoặc nhọn. Grep là một ví dụ khó hiểu bởi vì nó tự xử lý các dấu gạch chéo ngược.
Noah Spurrier

25

grep -e -X sẽ thực hiện các mẹo.


1
grep của tôi không có -e, rất kỳ lạ
Mike

14
năng lượng mặt trời cho sự mất mát
Mike

2
Có sẵn trên solaris từ / usr / xpg4 / bin / grep, btw. Rất nhiều tiện ích đầy đủ hơn trong thư mục đó.
khen ngợi

Nó hoạt động theo MinGW ( MinGW không hỗ trợ -P(nhưng đó là một câu chuyện khác và không áp dụng ở đây)).
Peter Mortensen



7

Tôi không có quyền truy cập vào máy Solaris, nhưng grep "\-X"hoạt động với tôi trên linux.


5

Cách chính xác sẽ là sử dụng "-" để dừng xử lý các đối số, như đã đề cập. Điều này là do việc sử dụng getopt_long (hàm GNU C từ getopt.h) trong nguồn của công cụ.

Đây là lý do tại sao bạn nhận thấy các hiện tượng tương tự trên các công cụ dòng lệnh khác; vì hầu hết trong số chúng là các công cụ GNU và sử dụng lệnh gọi này, chúng thể hiện hành vi tương tự.

Như một lưu ý phụ - getopt_long là thứ mang đến cho chúng ta sự lựa chọn tuyệt vời giữa -rlo và --really_long_option và sự kết hợp các đối số trong trình thông dịch.


3

Nếu bạn đang sử dụng một tiện ích khác chuyển một đối số cho grep, bạn có thể sử dụng:

'[-]X'


-1
ls -l | grep "^-"

Hy vọng điều này sẽ phục vụ mục đích của bạn.


2
Biểu thức này chỉ bắt các dòng bắt đầu bằng dấu gạch ngang. Nó không phù hợp với câu hỏi ban đầu. Anh ta muốn tìm kiếm một chuỗi bắt đầu bằng dấu gạch ngang nhưng các dòng chứa chuỗi này không cần thiết bắt đầu bằng dấu gạch ngang. Trong câu hỏi ban đầu, chuỗi bắt đầu bằng dấu gạch ngang có thể ở bất kỳ đâu trong dòng.
Laurent Simon

-1

tập tin grep "^ -X"

Nó sẽ grep và chọn tất cả các dòng tạo thành tập tin. ^ trong grep "^" chỉ ra một dòng bắt đầu bằng


1
Đã có câu trả lời gợi ý rằng stackoverflow.com/a/27440348/441757 (được đăng cách đây hơn một năm)
sIDIAbarker

OP đang tìm kiếm các chuỗi bắt đầu bằng -, không phải các dòng.
tiền mã hóa
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.