#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
ผู้นำ~
ทำอะไรในการแสดงออกปกติเริ่มต้น?
#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
ผู้นำ~
ทำอะไรในการแสดงออกปกติเริ่มต้น?
คำตอบ:
~
เป็นจริงส่วนหนึ่งของผู้ประกอบการ=~
ที่มีประสิทธิภาพการแข่งขันการแสดงออกปกติของสตริงไปซ้ายเพื่อการแสดงออกปกติขยายทางด้านขวา
[[ "string" =~ pattern ]]
โปรดทราบว่าสตริงควรถูกยกมาและนิพจน์ปกติไม่ควรยกมา
ตัวดำเนินการที่คล้ายกันถูกใช้ในภาษาการเขียนโปรแกรม Perl
นิพจน์ทั่วไปที่เข้าใจbash
จะเหมือนกับนิพจน์ที่ GNU grep
เข้าใจกับ-E
ธงนั่นคือชุดของนิพจน์ทั่วไป
ค่อนข้างปิดหัวข้อ แต่ก็ควรรู้:
เมื่อจับคู่กับนิพจน์ทั่วไปที่มีกลุ่มการจับภาพส่วนของสตริงที่จับโดยแต่ละกลุ่มจะมีอยู่ในBASH_REMATCH
อาร์เรย์ ข้อที่ศูนย์ / รายการแรกในสอดคล้องกับอาร์เรย์นี้&
ในรูปแบบการเปลี่ยนsed
ของคำสั่งเปลี่ยนตัว (หรือ$&
ใน Perl) ซึ่งเป็นบิตของสตริงที่ตรงกับรูปแบบในขณะที่รายการที่ดัชนีที่ 1 และเป็นต้นไปสอดคล้องกับ\1
, \2
ฯลฯ . ในsed
รูปแบบการเปลี่ยน (หรือ$1
, $2
ฯลฯ ใน Perl) คือบิตจับคู่โดยแต่ละวงเล็บ
ตัวอย่าง:
string=$( date +%T )
if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
printf 'Got %s, %s and %s\n' \
"${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi
สิ่งนี้อาจส่งออก
Got 09, 19 and 14
หากเวลาปัจจุบันเกิดขึ้นเป็น 09:19:14
REMATCH
บิตBASH_REMATCH
array ชื่อที่มาจากการ "จับคู่นิพจน์ทั่วไป" คือ "RE-Match"
ในbash
เชลล์ที่ไม่คล้ายบอร์นหนึ่งอาจใช้expr
สำหรับการจับคู่นิพจน์ทั่วไปที่ จำกัด (ใช้เฉพาะนิพจน์ปกติพื้นฐาน)
ตัวอย่างเล็ก ๆ :
$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
grep -E
เข้าใจเฉพาะในระบบ GNU และเฉพาะเมื่อใช้ตัวแปรที่ไม่มีเครื่องหมายเป็นรูปแบบ[[ $var = $pattern ]]
(ดู[[ 'a b' =~ a\sb ]]
vs p='a\sb'; [[ 'a b' =~ $p ]]
) นอกจากนี้ระวังว่าการอ้างเชลล์มีผลต่อความหมายของตัวดำเนินการ RE และอักขระบางตัวจำเป็นต้องอ้างถึงสำหรับโทเค็นเชลล์ที่อาจส่งผลกระทบต่อการประมวลผล RE [[ '\' =~ [\/] ]]
ผลตอบแทนที่เป็นเท็จ ksh93
มีปัญหาที่เลวร้ายยิ่งกว่า ดูzsh
(หรือทุบตี 3.1) สำหรับแนวทาง saner ที่เชลล์และการอ้างอิง RE แตกต่างกัน ใน[
ตัวzsh
และyash
ยังมี=~
ผู้ประกอบการ
off-topic
! +1 (
[[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]
zsh หรือว่าการเสนอราคา*
ยังตรงกับ? [[ "This is a fine mess." =~ "T.........fin*es*" ]]
.
[[ a =~ .* ]]
หรือ[[ a =~ '.*' ]]
หรือRE [[ a =~ \.\* ]]
เดียวกัน.*
ถูกส่งผ่านไปยัง=~
ผู้ประกอบการ OTH ในbash
, [[ '\' =~ [)] ]]
ผลตอบแทนข้อผิดพลาดคุณจะได้รู้โดยไม่ต้องพยายามมันไม่ว่าจะเป็น[[ '\' =~ [\)] ]]
แมตช์? วิธีการเกี่ยวกับ[[ '\' =~ [\/] ]]
(มันเป็น ksh93) วิธีการเกี่ยวกับc='a-z'; [[ a =~ ["$c"] ]]
(เปรียบเทียบกับ=
ผู้ประกอบการ)? ดูเพิ่มเติม: [[ '\' =~ [^]"."] ]]
ซึ่งจะส่งกลับเท็จ ... โปรดทราบว่าคุณสามารถทำได้shopt -s compat31
ในการbash
ที่จะได้รับzsh
พฤติกรรม
zsh
/ bash -o compat31
พฤติกรรมสำหรับ[[ a =~ '.*' ]]
ยังสอดคล้องกับ[ a '=~' '.*' ]
(สำหรับ[
การใช้งานที่สนับสนุน=~
) expr a : '.*'
หรือ OTOH ไม่สอดคล้องกับ[[ a = '*' ]]
vs [[ a = * ]]
(แต่แล้ว globs เป็นส่วนหนึ่งของภาษาเชลล์ในขณะที่ RE ไม่ได้เป็น)
คุณควรอ่าน bash man pages ภายใต้[[ expression ]]
หัวข้อ
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).
เรื่องยาวสั้น, =~
เป็นผู้ดำเนินการเช่นเดียวกับและ==
!=
มันไม่มีส่วนเกี่ยวข้องกับ regex จริงในสตริงทางด้านขวา
=~
ในชีวิตจริง ... ?
man [[ expresssion ]]
และman [[
ไม่คืนสิ่งใด help [[
ส่งคืนข้อมูลที่เป็นประโยชน์ตั้งแต่[[
คำสั่ง bash ภายใน แต่ไม่ได้บอกว่าจะ=~
ใช้ไวยากรณ์พื้นฐานหรือขยาย regex ⋯ข้อความที่คุณยกมานั้นมาจากหน้าbash man ฉันรู้ว่าคุณพูดว่า "อ่านหน้าคนทุบตี" แต่ตอนแรกฉันคิดว่าคุณหมายถึงอ่านหน้าคนที่อยู่ในทุบตี ให้man bash
ส่งคืนไฟล์ขนาดใหญ่ที่มีความยาว 4139 บรรทัด (72 หน้า) สามารถค้นหาได้โดยกด/▒▒▒
ซึ่งใช้ regex รสชาติที่=~
ไม่เหมือนที่ระบุ