ฉันค้นคว้ามามาก แต่ฉันยังไม่ชัดเจน อะไรคำว่าเขตแดนเฉลี่ย? มันทำอะไร?
ตัวอย่างเช่นมีคนอธิบายคำสั่งนี้ให้ฉันหน่อยได้ไหม
egrep '\b[A-Z]+\b' filename.sh
ฉันค้นคว้ามามาก แต่ฉันยังไม่ชัดเจน อะไรคำว่าเขตแดนเฉลี่ย? มันทำอะไร?
ตัวอย่างเช่นมีคนอธิบายคำสั่งนี้ให้ฉันหน่อยได้ไหม
egrep '\b[A-Z]+\b' filename.sh
คำตอบ:
ตามที่อธิบายไว้ที่นี่ยกตัวอย่างเช่นมันตรงระหว่างคำ:
มีสามตำแหน่งที่แตกต่างกันซึ่งมีคุณสมบัติเป็นขอบเขตของคำ:
- ก่อนอักขระตัวแรกในสตริงถ้าอักขระตัวแรกเป็นตัวอักษรคำ
- หลังจากอักขระตัวสุดท้ายในสตริงถ้าอักขระตัวสุดท้ายเป็นตัวอักษรคำ
- ระหว่างอักขระสองตัวในสตริงโดยที่หนึ่งคืออักขระคำและอีกตัวหนึ่งไม่ใช่อักขระคำ
นี่คือตัวอย่างของแต่ละกรณี:
สำหรับสตริงfoobar
กรณีแรกจะจับคู่
foobar
^-----here
สำหรับสตริงfoobar
ตัวพิมพ์ที่สองจะจับคู่
foobar
^--here
สำหรับสตริงfoo bar
กรณีที่สามจะจับคู่
foo bar
^--here, because space is not a word character
สิ่งที่มีคุณสมบัติเป็นตัวอักษรคำขึ้นอยู่กับการใช้งานการแสดงออกปกติเฉพาะ อย่างไรก็ตามในทุกกรณีตัวอักษร ( [a-z]
และ[A-Z]
), ตัวเลข ( [0-9]
) และ_
ถือเป็นตัวอักษรคำ
ดังนั้นตัวอย่าง regex ที่คุณโพสต์ ( \b[A-Z]+\b
) หมายถึงค้นหาสตริงที่ยาวที่สุดที่อยู่ระหว่างสองคำและที่ประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่เท่านั้น มันอาจจะง่ายต่อการอธิบายโดยตัวอย่าง:
echo "FOOBAR" | egrep '\b[A-Z]+\b' # Works
echo "FOO BAR" | egrep '\b[A-Z]+\b' # Works
echo "aFOOBARb" | egrep '\b[A-Z]+\b' # Does not work, we want capitals only
echo "12345" | egrep '\b[A-Za]+\b' # Does not work, no letters
echo "1FOOBAR2" | egrep '\b[A-Z]+\b' # Does not work, 1 and 2 are word chars
echo "_FOOBAR_" | egrep '\b[A-Z]+\b' # Does not work, _ is a word char
echo "#FOOBAR$" | egrep '\b[A-Z]+\b' # Works, # and $ are not word chars
egrep
(หรือ/usr/xpg4/bin/egrep
) ไม่ปฏิบัติ\b
เช่นนี้ ตัวอย่างเช่นecho "FOOBAR" | egrep '\b[A-Z]+\b'
จะไม่ตรงกัน
egrep '\b[A-Z]+\b' filename.sh
ให้ทำลายมันได้:
[A-Z]
แสดงให้เห็นถึงตัวละครตัวหนึ่งใด ๆ
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
ในชั้นเรียนของตัวละคร[A-Z]+
หมายถึงการเกิดขึ้นหนึ่งหรือมากกว่าของตัวอักษรตัวพิมพ์ใหญ่ ตรงกับตัวอย่างจะเป็น: A
, HELLO
, IS
, I
, ELEPHANT
ฯลฯ'\bINDIA\b'
: เป็นเหมือนคำทั้งค้นหาคำINDIA
ในกรณีบน มันจะไม่INDIANA
ตรงกับ ดังนั้นการใช้หลักการเดียวกัน - '\b[A-Z]+\b'
จะมองหาคำทั้งหมดที่มีตัวอักษรหนึ่งตัวหรือมากกว่าในกรณีบนegrep '\b[A-Z]+\b' filename.sh
จะค้นหาคำที่มีหนึ่งหรือมากกว่าตัวอักษรทั้งหมดในกรณีบนในแฟ้ม filename.sh
-\b
- เหมือนกับการค้นหาคำทั้งหมด
[azA-Z0-9_]
เป็นประกอบด้วย ตรวจสอบคู่มือสำหรับegrep(1)
บางทีการแก้ไขสำหรับนิพจน์ปกติที่ใช้งานอยู่