2010-03-11 34 views

Trả lời

289

Sử dụng:

grep -- -X

liên quan: What does a bare double dash mean? (nhờ nutty about natty).

+24

'- -' là một thủ thuật tiện dụng cho một số tiện ích Unix. – Johnsyweb

+1

Làm việc với 'ack' – dukedave

+43

cho những người trong chúng ta tự hỏi ở giai đoạn này những gì' --' có nghĩa là hoặc không: http://unix.stackexchange.com/questions/11376/what-does-double-dash-mean –

22

grep -e -X sẽ làm các trick.

+1

grep của tôi không có, rất lạ – Mike

+13

solaris cho số mất – Mike

+1

Có sẵn trên solaris từ/usr/xpg4/bin/grep, btw. Rất nhiều tiện ích hoàn chỉnh hơn trong thư mục đó. – pra

6

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.

+0

Không hoạt động với cờ -F! –

1

bạn có thể sử dụng nawk

$ nawk '/-X/{print}' file 
34

Các dấu gạch ngang là một nhân vật đặc biệt trong Bash như đã nêu 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 chỉ được bạn qua Bash, nhưng Grep vẫn có ý nghĩa riêng của nó để gạch ngang (bằng cách cung cấp các tùy chọn).

Vì vậy, bạn thực sự cần phải thoát khỏi 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 hoạt động

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

Một cách để thử cách Bash chuyển đối số cho tập lệnh/chương trình là tạo tập lệnh .sh chỉ lặp lại tất cả đối số. Tôi sử dụng một kịch bản gọi là echo-args.sh để chơi với bất cứ lúc nào, tất cả 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 nhận được các ý tưởng.

3

Cách chính xác sẽ là sử dụng "-" để ngừng xử lý đối số, như đã đề cập. Điều này là do việc sử dụng getopt_long (GNU C-function 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ùng một hiện tượng trên các công cụ dòng lệnh khác; vì hầu hết trong số đó là các công cụ GNU và sử dụng cuộc gọi này, chúng thể hiện cùng một hành vi.

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

1

Nếu bạn đang sử dụng một tiện ích mà vượt qua một đối số duy nhất để grep, bạn có thể sử dụng:

'[-]X' 
12
grep -- -X 
grep -- "-X" 
grep \\-X 
grep "\-X" 
grep -e -X 
grep [-]X 
0
ls -l | grep "^-" 

Hope này sẽ phục vụ mục đích của bạn.

+1

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. –

0

grep "^ -X" tệp

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

+1

Đã có câu trả lời gợi ý rằng http://stackoverflow.com/a/27440348/441757 (đã đăng hơn một năm trước) – sideshowbarker

+0

OP đang tìm kiếm * chuỗi * bắt đầu bằng '-', không phải dòng. – codeforester

Các vấn đề liên quan