จับคู่กับ grep เมื่อรูปแบบมีเครื่องหมายยัติภังค์“ -”


11

ฉันเขียนคำสั่งต่อไปนี้เพื่อให้ตรงกับ $ a กับ $ b แต่เมื่อค่ารวมถึง "-" แล้วฉันได้รับข้อผิดพลาด ฉันจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร

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

3
พิจารณาเปลี่ยนคำสั่งของคุณเป็นgrep -Fxc -- "$b" <<< "$a"เพื่อหลีกเลี่ยงการไปป์ที่ไม่จำเป็น
h3rrmiller

8
โดยวิธีการที่คุณต้องการจับคู่ regex หรือคุณต้องการทดสอบว่าสตริงเท่ากับ (หรือ substring ของ) สตริงอื่นหรือไม่ ในกรณีนั้นเชลล์ในตัว[[ ... ]]หรือcaseจะเป็นตัวเลือกที่ดีกว่าเนื่องจากคุณหลีกเลี่ยงทั้งนิสัยechoและกระบวนการลูก
Uwe

ไม่ว่าจะเป็นสตริงเท่ากับนี่คือการทดสอบของฉัน
yael


อีกทางเลือกหนึ่งที่คุณไม่ควรใช้ที่ไม่มีใครอยู่ในรายการ: เป็นไปได้ที่จะหลบเส้นประในสตริงที่ยกมาดังนั้นจึงเข้าใจได้grepว่าเป็นตัวอักษรมากกว่าที่จะเริ่มตัวเลือกเช่นecho test-test | grep "\-test"จะจับคู่มากกว่าบ่นเรื่อง-tธงที่ไม่รู้จัก
แอรอน

คำตอบ:


20

วาง--ก่อนรูปแบบของคุณ:

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

-- ระบุตัวเลือกคำสั่งในตอนท้ายสำหรับหลายคำสั่ง / เชลล์ในตัวหลังจากนั้นอาร์กิวเมนต์ที่เหลือจะถือว่าเป็นอาร์กิวเมนต์ตำแหน่ง


13

นอกเหนือจากคำตอบที่ยอดเยี่ยมของ @ sebasthคุณสามารถบอกได้ว่าgrep's -e รูปแบบพร้อมกับตัวเลือกที่จะใช้รูปแบบเป็นแบบ (ที่นี่ใช้ตัวดำเนินการ<<< zshที่นี่สตริงแทนechoดูความprintf '%s\n' "$a"พกพา)

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

หรือทั้งหมดข้างตัวเลือกอื่น ๆ

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

เนื่องจากเป้าหมายของคุณคือการเปรียบเทียบความเท่าเทียมกันของสตริงแบบไบต์ต่อไบต์ใช้[คำสั่งแทน

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

หรือถ้า$aมี$bให้ใช้การ[[...]]สร้าง ksh:

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

หรือมากกว่านั้นในพอร์ตเชลล์แบบเชลล์ทั้งหมด:

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

==ไม่ใช่มาตรฐานสำหรับ[คำสั่ง; มันเป็น bashism ใช้=แทน
Wildcard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.