Khớp với grep khi mẫu chứa dấu gạch nối


11

Tôi đã viết lệnh sau để khớp $ a với $ b, nhưng khi giá trị bao gồm "-" thì tôi gặp lỗi. Làm thế nào tôi có thể tránh điều đó?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified

3
Cân nhắc thay đổi lệnh của bạn grep -Fxc -- "$b" <<< "$a"để tránh đường ống không cần thiết
h3rrmiller

8
Nhân tiện, bạn có thực sự muốn một trận đấu regex không, hay bạn chỉ muốn kiểm tra xem một chuỗi có bằng (hoặc là một chuỗi con của) một chuỗi khác không? Trong trường hợp đó, shell được tích hợp sẵn [[ ... ]]hoặc casesẽ là lựa chọn tốt hơn, vì bạn tránh được cả các đặc điểm riêng echovà quy trình con.
Uwe

liệu một chuỗi có bằng không đây là thử nghiệm của tôi
yael


Một cách khác mà bạn không nên sử dụng mà không ai liệt kê: có thể thoát dấu gạch ngang bên trong một chuỗi được trích dẫn để nó được hiểu greplà một ký tự theo nghĩa đen thay vì bắt đầu một tùy chọn, nghĩa là echo test-test | grep "\-test"sẽ khớp thay vì phàn nàn về một -tcờ không xác định .
Aaron

Câu trả lời:


20

Đặt --trước mẫu của bạn:

echo "$a"  | grep -Fxc -- "$b"

-- chỉ định kết thúc các tùy chọn lệnh cho nhiều lệnh / shell dựng sẵn, sau đó các đối số còn lại được coi là đối số vị trí.


13

Bên cạnh câu trả lời tuyệt vời của @ sebasth , bạn có thể nói rằng MẪU với grep's -e tùy chọn sử dụng MẪU làm mẫu (ở đây sử dụng <<< zshtoán tử chuỗi ở đây thay vì echo; xem thêm printf '%s\n' "$a"về tính di động).

grep -Fxc -e "$b" <<<"$a"

Hoặc tất cả bên cạnh các lựa chọn khác.

grep -Fxce "$b" <<<"$a"

Vì mục tiêu của bạn là so sánh bình đẳng chuỗi byte-byte nên sử dụng [lệnh thay thế.

if [ "$a" = "$b" ]

Hoặc nếu $a$b, sử dụng [[...]]cấu trúc ksh:

if [[ $a == *"$b"* ]]

Hoặc rõ ràng hơn trong tất cả các vỏ giống như Bourne:

case $a in
  *"$b"*) ...
esac

==không phải là tiêu chuẩn cho [lệnh; đó là một bashism . Sử dụng =thay thế.
tự đại diện
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.