ด้วย Terminal: การใช้นิพจน์ทั่วไป

สิ่งหนึ่งที่ฉันชอบมาตลอดเกี่ยวกับเทอร์มินัล Linux คือสิ่งที่คุณสามารถทำได้โดยใช้นิพจน์ทั่วไป ไม่ว่าเราจะต้องหาข้อความที่ซับซ้อนหรือแทนที่ด้วยข้อความอื่นการใช้นิพจน์ทั่วไปสามารถทำให้งานง่ายขึ้นได้มาก เริ่มจากจุดเริ่มต้น:

คำเตือน: ท่านี้ปวดตูด การอ่านกระทู้นี้ตลอดเวลาอาจทำให้เสียสติได้ หยุดพักระหว่างหรือถามแพทย์หรือเภสัชกรของคุณก่อนอ่านโพสต์ทั้งหมด

นิพจน์ทั่วไปคืออะไร?

นิพจน์ทั่วไปคือชุดของอักขระพิเศษที่ช่วยให้เราสามารถอธิบายข้อความที่เราต้องการค้นหาได้ ตัวอย่างเช่นหากเราต้องการค้นหาคำว่า "linux" ก็เพียงพอที่จะใส่คำนั้นลงในโปรแกรมที่เราใช้อยู่ คำว่าตัวเองเป็นนิพจน์ทั่วไป จนถึงตอนนี้ดูเหมือนง่ายมาก แต่ถ้าเราต้องการค้นหาตัวเลขทั้งหมดในไฟล์ใดไฟล์หนึ่งล่ะ? หรือทุกบรรทัดที่ขึ้นต้นด้วยอักษรตัวใหญ่? ในกรณีดังกล่าวคุณไม่สามารถใส่คำง่ายๆได้อีกต่อไป วิธีแก้ไขคือใช้นิพจน์ทั่วไป

นิพจน์ทั่วไปเทียบกับรูปแบบไฟล์

ก่อนที่เราจะเข้าสู่นิพจน์ทั่วไปฉันต้องการล้างความเข้าใจผิดทั่วไปเกี่ยวกับนิพจน์ทั่วไป นิพจน์ทั่วไปไม่ใช่สิ่งที่เราใส่เป็นพารามิเตอร์ในคำสั่งเช่น rm, cp และอื่น ๆ เพื่ออ้างถึงไฟล์ต่างๆในฮาร์ดไดรฟ์ นั่นจะเป็นรูปแบบไฟล์ นิพจน์ทั่วไปแม้ว่าจะคล้ายกันตรงที่ใช้อักขระทั่วไป แต่ก็มีความแตกต่างกัน รูปแบบไฟล์จะเริ่มทำงานกับไฟล์บนฮาร์ดดิสก์และส่งคืนรูปแบบที่ตรงกับรูปแบบทั้งหมดในขณะที่นิพจน์ทั่วไปจะถูกยิงต่อข้อความและส่งกลับบรรทัดที่มีข้อความที่ค้นหา ตัวอย่างเช่นนิพจน์ทั่วไปที่สอดคล้องกับรูปแบบ *.* มันจะเป็นอย่างนั้น ^.*\..*$

ประเภทของนิพจน์ทั่วไป

ไม่ใช่ทุกโปรแกรมที่ใช้นิพจน์ทั่วไปเดียวกัน ไม่มากไม่น้อย. มีนิพจน์ทั่วไปหลายประเภทไม่มากก็น้อย แต่มีโปรแกรมที่เปลี่ยนแปลงไวยากรณ์เล็กน้อยรวมถึงส่วนขยายของตัวเองหรือแม้แต่ใช้อักขระที่แตกต่างกันโดยสิ้นเชิง ดังนั้นเมื่อคุณต้องการใช้นิพจน์ทั่วไปกับโปรแกรมที่คุณไม่รู้จักดีสิ่งแรกที่ต้องทำคือดูคู่มือหรือเอกสารของโปรแกรมเพื่อดูว่านิพจน์ทั่วไปที่รับรู้นั้นมีลักษณะอย่างไร

ประการแรกมีนิพจน์ทั่วไปสองประเภทหลักซึ่งมีอยู่ในมาตรฐาน POSIX ซึ่งเป็นสิ่งที่เครื่องมือ Linux ใช้ เป็นนิพจน์ทั่วไปพื้นฐานและแบบขยาย คำสั่งจำนวนมากที่ทำงานกับนิพจน์ทั่วไปเช่น grep หรือ sed อนุญาตให้คุณใช้สองประเภทนี้ ฉันจะพูดถึงพวกเขาด้านล่าง นอกจากนี้ยังมีนิพจน์ทั่วไปสไตล์ PERL แล้วยังมีโปรแกรมเช่น vim หรือ emacs ที่ใช้ตัวแปรเหล่านี้ ขึ้นอยู่กับสิ่งที่เราต้องการทำอาจเหมาะสมกว่าที่จะใช้อย่างใดอย่างหนึ่ง

การทดสอบนิพจน์ทั่วไป

ไวยากรณ์ของนิพจน์ทั่วไปไม่มีอะไรน่าสนใจ เมื่อเราต้องเขียนนิพจน์ทั่วไปที่ซับซ้อนเราจะอยู่หน้าสตริงของอักขระพิเศษที่ไม่สามารถเข้าใจได้ในแวบแรกดังนั้นการเรียนรู้วิธีใช้จึงจำเป็นอย่างยิ่งที่จะต้องมีวิธีทำแบบทดสอบทั้งหมดที่เราต้องการและดู ผลลัพธ์ได้อย่างง่ายดาย นั่นคือเหตุผลที่ตอนนี้ฉันจะใส่คำสั่งหลายคำสั่งซึ่งเราสามารถทำการทดสอบและทดลองทุกอย่างที่เราต้องการจนกว่าเราจะมีการควบคุมนิพจน์ทั่วไป

คำสั่งแรกคือคำสั่ง grep นี่คือคำสั่งที่เราจะใช้บ่อยที่สุดในการค้นหา ไวยากรณ์มีดังนี้:

grep [-E] 'REGEX' FICHERO
COMANDO | grep [-E] 'REGEX'

ฉันขอแนะนำให้ใส่นิพจน์ทั่วไปในเครื่องหมายคำพูดเดี่ยวเสมอเพื่อไม่ให้เชลล์ขึ้นไป วิธีแรกคือการค้นหานิพจน์ทั่วไปในไฟล์ อย่างที่สองอนุญาตให้กรองเอาต์พุตของคำสั่งผ่านนิพจน์ทั่วไป โดยค่าเริ่มต้น grep ใช้นิพจน์ทั่วไปพื้นฐาน อ็อพชัน -E ใช้สำหรับการใช้นิพจน์ทั่วไปเพิ่มเติม

เคล็ดลับที่สามารถช่วยให้เราเห็นว่านิพจน์ทั่วไปทำงานอย่างไรคือเปิดใช้งานการใช้สีในคำสั่ง grep ด้วยวิธีนี้ส่วนของข้อความที่ตรงกับนิพจน์ทั่วไปที่เราใช้จะถูกไฮไลต์ ในการเปิดใช้งานสีในคำสั่ง grep เพียงตรวจสอบให้แน่ใจว่าตัวแปรสภาพแวดล้อม GREP_OPTIONS มีมูลค่า --colorซึ่งสามารถทำได้ด้วยคำสั่งนี้:

GREP_OPTIONS=--color

เราสามารถใส่ไว้ใน. bashrc เพื่อเปิดใช้งานเสมอ

อีกวิธีหนึ่งในการใช้นิพจน์ทั่วไปคือการใช้คำสั่ง sed เหมาะสำหรับการแทนที่ข้อความ แต่ยังสามารถใช้ในการค้นหาได้อีกด้วย ไวยากรณ์ของมันจะเป็นดังนี้:

sed -n[r] '/REGEX/p' FICHERO
COMANDO | sed -n[r] '/REGEX/p'

คำสั่ง sed ยังใช้นิพจน์ทั่วไปพื้นฐานโดยค่าเริ่มต้นคุณสามารถใช้นิพจน์ทั่วไปที่ขยายได้ด้วยตัวเลือก -r

คำสั่งอื่นที่ฉันต้องการตั้งชื่อคือ awk คำสั่งนี้สามารถใช้ได้กับหลาย ๆ อย่างเนื่องจากช่วยให้คุณสามารถเขียนสคริปต์ในภาษาโปรแกรมของคุณเองได้ หากสิ่งที่เราต้องการคือการค้นหานิพจน์ทั่วไปในไฟล์หรือในผลลัพธ์ของคำสั่งวิธีใช้จะเป็นดังต่อไปนี้:

awk '/REGEX/' FICHERO
COMANDO | awk '/REGEX/'

คำสั่งนี้ใช้นิพจน์ทั่วไปแบบขยายเสมอ

ในการทำการทดสอบของเราเราจะต้องมีข้อความที่จะใช้เป็นตัวอย่างในการค้นหา เราสามารถใช้ข้อความต่อไปนี้:

- Lista de páginas wiki:

ArchLinux: https://wiki.archlinux.org/
Gentoo: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/

- Fechas de lanzamiento:

Arch Linux: 11-03-2002
Gentoo: 31/03/2002
CentOs: 14-05-2004 03:32:38
Debian: 16/08/1993
Ubuntu: 20/10/2004

Desde Linux Rulez.

นี่คือข้อความที่ฉันจะใช้เป็นตัวอย่างในส่วนที่เหลือของโพสต์ดังนั้นฉันขอแนะนำให้คุณคัดลอกลงในไฟล์เพื่อใช้งานได้จากเทอร์มินัล คุณสามารถใส่ชื่อที่คุณต้องการ ฉันเรียกมันว่า regex

บทเรียนเริ่มต้น

ตอนนี้เรามีทุกสิ่งที่จำเป็นในการเริ่มทดสอบนิพจน์ทั่วไป ไปทีละนิดเถอะ ฉันจะใส่ตัวอย่างการค้นหาหลาย ๆ แบบด้วยนิพจน์ทั่วไปซึ่งฉันจะอธิบายว่าอักขระแต่ละตัวมีไว้เพื่ออะไร ไม่ใช่ตัวอย่างที่ดีนัก แต่เนื่องจากฉันจะโพสต์ที่ยาวมากฉันจึงไม่ต้องการทำให้มันซับซ้อนอีกต่อไป และฉันจะขีดข่วนพื้นผิวของสิ่งที่สามารถทำได้ด้วยนิพจน์ทั่วไป

สิ่งที่ง่ายที่สุดคือค้นหาคำเฉพาะตัวอย่างเช่นสมมติว่าเราต้องการค้นหาบรรทัดทั้งหมดที่มีคำว่า "Linux" นี่เป็นวิธีที่ง่ายที่สุดเนื่องจากเราต้องเขียน:

grep 'Linux' regex

และเราจะเห็นผลลัพธ์:

โค้งลินุกซ์: https://wiki.archlinux.org/ ซุ้ม ลินุกซ์: 11-03-2002 จาก ลินุกซ์ Rulez

นี่คือสามบรรทัดที่มีคำว่า "Linux" ซึ่งหากเราใช้เคล็ดลับสีแล้วจะปรากฏเป็นไฮไลต์ โปรดทราบว่าคำนี้จดจำคำที่เรากำลังมองหาแม้ว่าจะเป็นส่วนหนึ่งของคำที่ยาวกว่าใน "ArchLinux" ก็ตาม อย่างไรก็ตามจะไม่เน้นคำว่า "linux" ที่ปรากฏใน URL "https://wiki.archlinux.org/" นั่นเป็นเพราะมันปรากฏที่นั่นด้วยตัวพิมพ์เล็ก "l" และเราได้มองหามันเป็นตัวพิมพ์ใหญ่ คำสั่ง grep มีตัวเลือกสำหรับสิ่งนี้ แต่ฉันจะไม่พูดถึงพวกเขาในบทความเกี่ยวกับนิพจน์ทั่วไป

ด้วยการทดสอบง่ายๆนี้เราสามารถสรุปข้อสรุปแรก:

  • อักขระปกติที่ใส่ในนิพจน์ทั่วไปจะจับคู่ตัวเอง

ซึ่งหมายความว่าถ้าคุณใส่ตัวอักษร "a" มันจะมองหาตัวอักษร "a" ดูเหมือนตรรกะใช่มั้ย? 🙂

สมมติว่าเราต้องการค้นหาคำว่า "CentO" ตามด้วยอักขระใด ๆ แต่มีเพียงอักขระเดียว สำหรับสิ่งนี้เราสามารถใช้อักขระ "." ซึ่งเป็นสัญลักษณ์แทนที่ตรงกับอักขระใด ๆ แต่มีเพียงตัวเดียว:

grep 'CentO.' regex

และผลลัพธ์คือ:

CentOS: http://wiki.centos.org/
CentO: 14-05-2004 03:32:38

ซึ่งหมายความว่าจะมี "S" ใน "CentOS" แม้ว่าในกรณีหนึ่งจะเป็นตัวพิมพ์ใหญ่และตัวพิมพ์เล็กอื่น หากมีตัวละครอื่นปรากฏในสถานที่นั้นก็จะรวมตัวละครนั้นด้วย เรามีกฎข้อที่สองอยู่แล้ว:

  • บทบาท "." ตรงกับอักขระใด ๆ

มันไม่ได้เป็นเรื่องเล็กน้อยอย่างที่เห็นอีกต่อไป แต่ด้วยสิ่งนี้เราไม่สามารถทำอะไรได้มากนัก ไปต่อกันอีกหน่อย สมมติว่าเราต้องการค้นหาบรรทัดที่ปรากฏในปี 2002 และ 2004 ดูเหมือนว่าจะเป็นการค้นหาสองครั้ง แต่สามารถทำได้พร้อมกันดังนี้:

grep '200[24]' regex

ซึ่งหมายความว่าเราต้องการหาหมายเลข 200 ตามด้วย 2 หรือ 4 และผลลัพธ์ก็คือ:

อาร์ค ลินุกซ์: 11-03-2002
เก็นทู: 31/03 /2002
CentOS: 14-05-2004 03:32:38
Ubuntu: 20/10/2004

ซึ่งนำเราไปสู่กฎข้อที่สาม:

  • อักขระหลายตัวที่อยู่ในวงเล็บจะตรงกับอักขระใด ๆ ภายในวงเล็บ

วงเล็บให้เล่นมากขึ้น นอกจากนี้ยังสามารถใช้เพื่อยกเว้นอักขระ ตัวอย่างเช่นสมมติว่าเราต้องการค้นหาไซต์ที่มีอักขระ ":" ปรากฏขึ้น แต่ไม่ตามด้วย "/" คำสั่งจะเป็นดังนี้:

grep ':[^/]' regex

มันเป็นเพียงเรื่องของการใส่ "^" เป็นอักขระตัวแรกในวงเล็บ คุณสามารถใส่อักขระทั้งหมดที่คุณต้องการด้านล่าง ผลลัพธ์ของคำสั่งสุดท้ายนี้มีดังต่อไปนี้:

อาร์คลินุกซ์: https://wiki.archlinux.org/
Gentoo: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/
Arch Linux: 11-03-2002 Gentoo: 31/03/2002 CentOs: 14-05-2004 03:32:38 เดเบียน: 16/08/1993 Ubuntu: 20/10/2004

ตอนนี้ ":" ที่อยู่ด้านหลังชื่อ distro จะถูกไฮไลต์ แต่ไม่ใช่ชื่อใน URL เนื่องจาก URL มี "/" อยู่ข้างหลัง

  • การใส่อักขระ "^" ที่จุดเริ่มต้นของวงเล็บจะจับคู่อักขระใด ๆ ยกเว้นอักขระอื่น ๆ ในวงเล็บ

สิ่งที่เราทำได้อีกอย่างคือระบุช่วงของอักขระ ตัวอย่างเช่นหากต้องการค้นหาตัวเลขใด ๆ ตามด้วย "-" จะมีลักษณะดังนี้:

grep '[0-9]-' regex

ด้วยเหตุนี้เราจึงระบุอักขระระหว่าง 0 ถึง 9 แล้วจึงมีเครื่องหมายลบ มาดูผลลัพธ์กัน:

ArchLinux: 11-03-ศูนย์ปี 2002: 14-05-2004 03: 32: 38

สามารถระบุได้หลายช่วงภายในวงเล็บเพื่อผสมช่วงที่มีอักขระเดี่ยว

  • การวางอักขระสองตัวที่คั่นด้วย "-" ภายในวงเล็บจะตรงกับอักขระใด ๆ ภายในช่วง

มาดูกันว่าเราสามารถเลือกส่วนแรกของ URL ได้หรือไม่ ข้อความที่ระบุว่า "http" หรือ "https" พวกเขาแตกต่างกันใน "s" สุดท้ายเท่านั้นดังนั้นลองทำดังนี้:

grep -E 'https?' regex

เครื่องหมายคำถามใช้เพื่อทำให้อักขระทางซ้ายเป็นทางเลือก แต่ตอนนี้เราได้เพิ่มตัวเลือก -E ลงในคำสั่งแล้ว เนื่องจากการสอบสวนเป็นคุณลักษณะของนิพจน์ทั่วไปที่ขยายออกไป จนถึงตอนนี้เราใช้นิพจน์ทั่วไปพื้นฐานดังนั้นจึงไม่จำเป็นต้องใส่อะไรเลย มาดูผลลัพธ์กัน:

อาร์คลินุกซ์: ที่ https: //wiki.archlinux.org/ Gentoo: ที่ https: //wiki.gentoo.org/wiki/Main_Page CentOS: ที่ http: //wiki.centos.org/ เดเบียน: ที่ https: //wiki.debian.org/ Ubuntu: ที่ https: //wiki.ubuntu.com/

ดังนั้นเราจึงมีกฎใหม่แล้ว:

  • อักขระตามด้วย "?" ตรงกับอักขระนั้นหรือไม่มีเลย ใช้ได้เฉพาะกับนิพจน์ทั่วไปที่ขยาย

ตอนนี้เราจะพบคำสองคำที่แตกต่างกันอย่างสิ้นเชิง มาดูวิธีค้นหาบรรทัดที่มีทั้งคำว่า "Debian" และ "Ubuntu"

grep -E 'Debian|Ubuntu' regex

ด้วยแถบแนวตั้งเราสามารถแยกนิพจน์ทั่วไปสองรายการขึ้นไปและมองหาบรรทัดที่ตรงกับนิพจน์ใดก็ได้:

debian: https://wiki.debian.org/
อูบุนตู: https://wiki.ubuntu.com/
debian: 16 / 08 / 1993
อูบุนตู: 20 / 10 / 2004
  • อักขระ« | » ทำหน้าที่แยกนิพจน์ทั่วไปหลาย ๆ นิพจน์และจับคู่นิพจน์ใด ๆ นอกจากนี้ยังมีความเฉพาะเจาะจงสำหรับนิพจน์ทั่วไปแบบขยาย

มาดูกันต่อเลย ตอนนี้เราจะมองหาคำว่า "Linux" แต่จะไม่ติดอยู่กับคำอื่นทางด้านซ้าย เราสามารถทำได้ดังนี้:

grep '\

อักขระที่สำคัญในที่นี้คือ "<" แต่จำเป็นต้องหลีกเลี่ยงโดยใส่ "\" ไว้ข้างหน้าเพื่อให้ grep ตีความว่าเป็นอักขระพิเศษ ผลลัพธ์เป็นดังนี้:

โค้ง ลินุกซ์: 11-03-2002 จาก ลินุกซ์ Rulez

คุณยังสามารถใช้ "\>" เพื่อค้นหาคำที่ไม่ถูกต้องอยู่ติดกัน ลองดูตัวอย่าง ลองใช้คำสั่งนี้:

grep 'http\>' regex

ผลลัพธ์ที่ได้คือ:

CentOS: ที่ http: //wiki.centos.org/

"http" ออกมา แต่ไม่ใช่ "https" เนื่องจากใน "https" ยังคงมีอักขระทางขวาของ "p" ที่สามารถเป็นส่วนหนึ่งของคำได้

  • อักขระ "<" และ ">" ตรงกับจุดเริ่มต้นและจุดสิ้นสุดของคำตามลำดับ อักขระเหล่านี้ต้องถูกหลีกเลี่ยงเพื่อไม่ให้ถูกตีความว่าเป็นอักขระตามตัวอักษร

เราไปกับสิ่งที่ซับซ้อนกว่าเล็กน้อย อักขระ "+" จับคู่อักขระทางด้านซ้ายซ้ำอย่างน้อยหนึ่งครั้ง อักขระนี้ใช้ได้เฉพาะกับนิพจน์ทั่วไปที่ขยาย ด้วยวิธีนี้เราสามารถค้นหาลำดับของตัวเลขหลายตัวในแถวที่ขึ้นต้นด้วย ":"

grep -E ':[0-9]+' regex

ผล:

ศูนย์: 14-05-2004 03: 32: 38

นอกจากนี้ยังมีการไฮไลต์หมายเลข 38 เพราะขึ้นต้นด้วย ":" ด้วย

  • อักขระ "+" จะจับคู่อักขระทางด้านซ้ายซ้ำอย่างน้อยหนึ่งครั้ง

คุณยังสามารถควบคุมจำนวนการเกิดซ้ำโดยใช้ "{" และ "}" แนวคิดคือการใส่วงเล็บปีกกาตัวเลขที่ระบุจำนวนการทำซ้ำที่แน่นอนที่เราต้องการ คุณยังสามารถใส่ช่วง มาดูตัวอย่างของทั้งสองกรณี

ก่อนอื่นเราจะค้นหาลำดับสี่หลักทั้งหมดที่มี:

grep '[0-9]\{4\}' regex

สังเกตว่าวงเล็บปีกกาจะต้องหนีถ้าเราใช้นิพจน์ทั่วไปพื้นฐาน แต่ไม่ใช่ถ้าเราใช้เครื่องหมายขยาย เมื่อขยายออกไปจะเป็นดังนี้:

grep -E '[0-9]{4}' regex

และผลลัพธ์ในทั้งสองกรณีจะเป็นดังนี้:

อาร์ค ลินุกซ์: 11-03-2002
เก็นทู: 31/03 /2002
CentOS: 14-05-2004 03:32:38
Debian: 16/08/1993
อูบุนตู: 20/10 /2004
  • อักขระ "{" และ "}" ที่มีตัวเลขคั่นตรงกับอักขระก่อนหน้านี้ซ้ำตามจำนวนครั้งที่ระบุ

ตอนนี้ตัวอย่างอื่น ๆ ที่มีเครื่องมือจัดฟัน สมมติว่าเราต้องการค้นหาคำที่มีตัวอักษรพิมพ์เล็กระหว่าง 3 ถึง 6 ตัว เราสามารถทำสิ่งต่อไปนี้:

grep '[a-z]\{3,6\}' regex

และผลลัพธ์จะเป็นดังนี้:

- Lista de หน้าs วิกิพีเดีย: ถึงrchLinux.inux: ที่ https/ :/วิกิพีเดีย.ArchLinux.org/ ชเอนทู: ที่ https/ :/วิกิพีเดีย.เก็นทู.org/วิกิพีเดีย/MAin_Pอายุ
CกิจการOS: ที่ http/ :/วิกิพีเดีย.CentOS.org/ งอีเบียน: ที่ https/ :/วิกิพีเดีย.เดเบียน.org/ หรือตอม่อ: ที่ https/ :/วิกิพีเดีย.อูบุนตู.COM/ - ฉคุณพลาด de ยิง: ถึงrch Linux.inux: 11-03-2002 ชเอนทู: 31/03/2002 คกิจการOs: 14-05-2004 03:32:38
Dอีเบียน: 16/08/1993 Uตอม่อ: 20/10/2004 งมันคือ Linux.inux Rอูเลซ.

ซึ่งอย่างที่คุณเห็นมันดูไม่เหมือนที่เราต้องการสักเท่าไหร่ นั่นเป็นเพราะนิพจน์ทั่วไปพบตัวอักษรภายในคำอื่นที่ยาวกว่า ลองรุ่นอื่น ๆ นี้:

grep '\<[a-z]\{3,6\}\>' regex

ผล:

- รายชื่อหน้า วิกิพีเดีย: ArchLinux: ที่ https/ :/วิกิพีเดีย.archlinuxorg/ Gentoo: ที่ https/ :/วิกิพีเดีย.เก็นทู.org/วิกิพีเดีย/ Main_Page CentOS: ที่ http/ :/วิกิพีเดีย.CentOS.org/ เดเบียน: ที่ https/ :/วิกิพีเดีย.เดเบียน.org/ Ubuntu: ที่ https/ :/วิกิพีเดีย.อูบุนตู.COM/

สิ่งนี้ดูเหมือนสิ่งที่เราต้องการมากขึ้นแล้ว สิ่งที่เราทำคือต้องการให้คำนั้นเริ่มต้นก่อนตัวอักษรตัวแรกและจบหลังจากตัวสุดท้าย

  • อักขระ "{" และ "}" ที่มีตัวเลขสองตัวคั่นด้วยเครื่องหมายจุลภาคตรงกับอักขระก่อนหน้านี้ซ้ำตามจำนวนครั้งที่ระบุด้วยตัวเลขสองตัว

ตอนนี้มาดูอักขระที่เป็นไพรม์ของ "+" มันคือ "*" และการทำงานของมันจะคล้ายกันมากเพียง แต่จับคู่อักขระจำนวนเท่าใดก็ได้รวมทั้งศูนย์ นั่นคือมันทำเช่นเดียวกับ "+" แต่ไม่ต้องการให้อักขระทางด้านซ้ายปรากฏในข้อความ ตัวอย่างเช่นลองค้นหาที่อยู่ที่ขึ้นต้นด้วย wiki และลงท้ายด้วย org:

grep 'wiki.*org' regex

มาดูผลลัพธ์กัน:

ArchLinux: https: //วิกิ.archlinux.org/ Gentoo: https: //wiki.gentoo.org/ wiki / Main_Page CentOS: http: //wiki.centos.org/ เดเบียน: https: //วิกิ.debian.org/

Perfecto

ตอนนี้ตัวละครสุดท้ายที่เราจะได้เห็น อักขระ "\" ใช้เพื่อหลีกหนีอักขระไปทางขวาเพื่อให้อักขระนั้นสูญเสียความหมายพิเศษไป ตัวอย่างเช่นสมมติว่าเราต้องการค้นหาเส้นที่ลงท้ายด้วยจุด สิ่งแรกที่อาจเกิดขึ้นกับเราคือ:

grep '.$' regex

ผลลัพธ์ไม่ใช่สิ่งที่เรากำลังมองหา:

- รายชื่อหน้าวิกิ:
ArchLinux: https://wiki.archlinux.org/
เจนทู: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
เดเบียน: https://wiki.debian.org/
อูบุนตู: https://wiki.ubuntu.com/
- วันที่วางจำหน่าย: Arch Linux: 11-03-2002
เจนทู: 31/03/2002
CentOs: 14-05-2004 03:32:38
เดเบียน: 16/08/1993
Ubuntu: 20/10/2004
Desde Linux Rulez.

เนื่องจาก "." จับคู่อะไรก็ได้เพื่อให้นิพจน์ทั่วไปตรงกับอักขระสุดท้ายของแต่ละบรรทัดไม่ว่าจะเป็นอะไรก็ตาม ทางออกคือ:

grep '\.$' regex

ตอนนี้ผลลัพธ์คือสิ่งที่เราต้องการ:

Desde Linux Rulez.

จบเกม

แม้ว่าเรื่องของนิพจน์ทั่วไปจะซับซ้อนมากจนฉันจะให้บทความเป็นชุด ๆ แต่ฉันคิดว่าฉันให้ความเจ็บปวดกับคุณมากพอแล้ว หากคุณมาถึงแล้วขอแสดงความยินดี และถ้าคุณได้อ่านทั้งหมดนี้ในคราวเดียวให้ทานแอสไพรินหรืออะไรสักอย่างเพราะมันไม่ดี

สำหรับตอนนี้นั่นคือทั้งหมด ถ้าคุณชอบบทความนี้คุณอาจจะเขียนบทความอื่นก็ได้ ในระหว่างนี้ขอแนะนำให้คุณลองใช้นิพจน์ทั่วไปทั้งหมดในเทอร์มินัลเพื่อดูวิธีการทำงานอย่างชัดเจน และอย่าลืมว่ามีเพียง Chuck Norris เท่านั้นที่สามารถแยกวิเคราะห์ HTML โดยใช้นิพจน์ทั่วไป


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   เอเสเคียล dijo

    ชีวิตของเราจะเป็นอย่างไรหากไม่มี regex?
    บทความนี้มีประโยชน์มาก แต่ฉันจะอ่านทีละน้อย ขอบคุณมาก.

    1.    ฐานสิบหก dijo

      ขอบคุณสำหรับความคิดเห็น ฉันยังไม่เชื่อว่าบทความของฉันออกมา 🙂มีข้อผิดพลาดบางอย่างออกมา แต่ฉันหวังว่ามันจะเป็นประโยชน์ 🙂

  2.   สคาลิเบอร์ dijo

    ขอบคุณสสสสสสสส! ..

    ก่อนหน้านี้ฉันต้องศึกษาเกี่ยวกับนิพจน์ทั่วไปเล็กน้อย .. .. ฉันขอบคุณสำหรับการสอน .. และคำแนะนำทีละขั้นตอนเพื่อเรียนรู้แต่ละคำ

    ดีมาก! .. .. กำลังจะได้ยาแอสไพริน.. อิอิ

    1.    ฐานสิบหก dijo

      ยินดีต้อนรับ ความกล้าหาญและการแสดงออกปกตินั้นไม่สามารถอยู่กับคุณได้ 🙂

  3.   แทนแร็กซ์ dijo

    โพสต์เด็ด! เยี่ยมมาก ฉันสงสัยว่าคุณใช้เวลากี่ชั่วโมง😀

    1.    ฐานสิบหก dijo

      ฮ่า ๆ!! คำถามคือฉันจะใช้เวลากี่ชั่วโมงถ้าฉันพูดทุกอย่างที่ตั้งใจจะพูด? ไม่มีที่สิ้นสุด !! 🙂

  4.   ทัมมุซ dijo

    สิ่งหนึ่งที่ฉันไม่รู้บทความดีๆ!

    1.    ฐานสิบหก dijo

      ขอขอบคุณ. มีความยินดีที่จะแบ่งปันให้กับคุณ

  5.   เฮเลน่า_ริว dijo

    คำอธิบายที่ดี ขอแสดงความยินดี! มีประโยชน์จริงๆ!

    1.    ฐานสิบหก dijo

      ฉันดีใจที่คุณพบว่ามีประโยชน์ จึงเป็นเรื่องน่ายินดีที่จะเขียน

  6.   ป้องกัน dijo

    ควรไปที่ไหนเป็นพิเศษ เช่นเดียวกับรายการแนะนำ แต่มีประโยชน์เฉพาะเจาะจงมาก มีประโยชน์มากแม้ว่าฉันอยากจะเห็นว่ามันใช้กับ Vim

    1.    ฐานสิบหก dijo

      นั่นคือคำถามที่ถามตัวเอง ฉันมีบทความเพิ่มเติมเกี่ยวกับนิพจน์ทั่วไปอยู่ในใจ และฉันสามารถพูดคุยเกี่ยวกับกลุ่มในพวกเขา มีความแตกต่างบางประการจากที่ฉันได้อธิบายไว้ในบทความนี้ มันเป็นเรื่องของการดำเนินการกับมัน 🙂

  7.   เฟอร์นันโด dijo

    ดี!

    บทความของคุณดีมากเป็นเรื่องที่น่าสงสัยเมื่อเร็ว ๆ นี้ (ตอนนี้) ฉันได้เผยแพร่รายการที่ฉันได้เตรียมการมาสองสามวันบนเว็บไซต์ของฉันซึ่งฉันได้รวบรวมรายการ metaCharacters สำหรับนิพจน์ทั่วไปและตัวอย่างบางส่วน และมันก็ยุติธรรมแล้วที่ได้เข้ามา DesdeLinux และดูรายการในหัวข้อเดียวกัน!

    ถ้าเป็นการปลอบใจฉันก็น่าเบื่อมากขึ้น😀

    แน่นอนว่า regex เป็นหนึ่งในสิ่งที่มีประโยชน์มากที่สุดฉันมักจะใช้มันเพื่อตัดแต่งผลลัพธ์ของคำสั่งและเก็บส่วนที่ฉันสนใจจากนั้นโต้ตอบกับมันใน bash script เป็นต้น ฉันยังใช้มันมากมายในมหาวิทยาลัยและพวกเขามีความสำคัญอย่างยิ่งในการสร้างคอมไพเลอร์ (ในคำจำกัดความของพจนานุกรมและตัวแยกวิเคราะห์) ในระยะสั้นโลกทั้งใบ

    ทักทายและทำงานดีมาก

    1.    ฐานสิบหก dijo

      ขอบคุณมาก

      ฉันชอบบทความของคุณด้วย มันกระชับกว่าของฉัน สามารถใช้เป็นข้อมูลอ้างอิงอย่างรวดเร็ว มันเป็นเรื่องบังเอิญที่เราได้เขียนมันในเวลาเดียวกัน คุณจะเห็นได้ว่าผู้คนสนใจเรื่อง 🙂

  8.   Elery dijo

    นิพจน์ทั่วไปสำหรับ Dummies =) ตอนนี้มันชัดเจนสำหรับฉันโดยวิธีหนึ่งที่จะมีผลลัพธ์ที่มีสีสำหรับ grep คือการสร้างนามแฝงใน. bashrc alias grep = 'grep –color = always' ในกรณีที่ใช้ได้กับใครบางคน .

    ความนับถือ

    1.    ฐานสิบหก dijo

      จริง. นั่นก็เป็นอีกวิธีที่ทำได้ ขอบคุณสำหรับข้อมูล 🙂

  9.   KZKG ^ กาอาระ dijo

    O_O …ของอุดหนุน !!! O_O ...
    ขอบคุณมากสำหรับโพสต์นี้ฉันกำลังรออะไรแบบนั้นอยู่สักพักฮ่า ๆ ฉันเปิดทิ้งไว้เพื่ออ่านอย่างสงบที่บ้านโดยไม่ต้องวุ่นวายกับสมาธิฮ่า ๆ

    ขอบคุณสำหรับบทความฉันทำจริงๆ😀

    1.    ฐานสิบหก dijo

      ฉันรู้ว่าคุณต้องการมัน ฮ่า ๆ!! ความจริงก็คือมีหลายสิ่งที่ขาดหายไป แต่ฉันมีส่วนที่สองอยู่ในใจแล้ว 🙂

  10.   EliécerTatés dijo

    บทความดีๆถ้าเพิ่งอ่านเมื่อวานชั้นเรียนที่ฉันให้ในวันนี้จะง่ายกว่านี้สำหรับนักเรียน!

    1.    ฐานสิบหก dijo

      ฮ่า ๆ!! เสียดายที่มาช้า แต่ดีใจที่มีประโยชน์ 🙂

  11.   ลีโอโทโร่ dijo

    ในที่สุด !!! โพสต์ที่ดีสุด ๆ …. ในที่สุดฉันก็พบสิ่งที่อธิบายถึงนิพจน์ทั่วไปได้อย่างชัดเจน… ..

    1.    ฐานสิบหก dijo

      มีข้อมูลมากมายอยู่ที่นั่น แต่หาสิ่งที่เข้าใจง่ายได้ยากกว่า ฉันดีใจที่ได้เติมเต็มช่องว่างนั้น 🙂

      อาศิรพจน์

  12.   เช็คสเปียร์โรดส์ dijo

    สวัสดีฉันต้องการความช่วยเหลือฉันต้องทำการค้นหาใน / var / logs ด้วยรูปแบบ: yymmdd และบันทึกมาในลักษณะ 130901.log -130901.log ฉันต้องค้นหาสิ่งที่อยู่ระหว่างวันที่ 1 กันยายนถึง 11 ตุลาคม สิ่งเดียวที่ฉันทำได้คือลบทั้งหมดของเดือนกันยายน แต่ฉันไม่รู้วิธีทำห่วงโซ่ทั้งหมด:

    เช่น 1309 [0-3] ส่งคืนบันทึกให้ฉันระหว่างวันที่ 1 กันยายนถึง 30 กันยายน แต่ฉันไม่รู้ว่าจะอยู่ในห่วงโซ่เดียวกันได้อย่างไรตั้งแต่วันที่ 1 ถึง 11 ตุลาคม

    1.    ฐานสิบหก dijo

      การใช้นิพจน์ทั่วไปนั้นค่อนข้างซับซ้อน ฉันคิดว่าสิ่งนี้อาจใช้งานได้:

      13(09[0-3]|10(0|1[01]))

      มันเป็นนิพจน์ทั่วไปแบบขยาย คุณไม่ได้บอกว่าคุณกำลังใช้เครื่องมือใดดังนั้นฉันจึงไม่สามารถให้รายละเอียดเพิ่มเติมได้

      อย่างไรก็ตามฉันคิดว่าเป็นกรณีนี้แทนที่จะใช้นิพจน์ทั่วไปจะดีกว่าถ้าใช้ find คุณสามารถลองสิ่งนี้:

      หา. - ใหม่ '01 ก.ย. '-a! - ใหม่ '11 ต.ค. '- พิมพ์

      โชค. หวังว่านี่จะช่วยคุณได้

  13.   ชิโป dijo

    สวัสดี! ก่อนอื่นฉันอยากจะขอบคุณสำหรับการทำงานของคุณเนื่องจากหน้านี้อยู่ใน "3 อันดับแรก" ของไซต์ Linux ที่ดีที่สุดของฉัน
    ฉันกำลังฝึกฝนและไม่รู้ว่าทำไม RegExp บนหมายเลขโทรศัพท์ถึงใช้งานไม่ได้สำหรับฉันและมันก็คือฉันไม่มี "-E" (ซึ่งฉันตระหนักได้ว่าต้องขอบคุณโพสต์นี้)
    ฉันอยากถามคุณว่าคุณไม่รู้จัก pdf หรือไซต์ที่ดีที่มีแบบฝึกหัดใน RegExp แม้ว่าจะมีจินตนาการเพียงเล็กน้อยคุณก็สามารถฝึกประดิษฐ์มันด้วยตัวเองได้

    สวัสดี Pablo

  14.   คาลี dijo

    ดีมากฉันเพิ่งอ่านทั้งหมดและใช่ตอนนี้ฉันต้องการแอสไพริน🙂

  15.   ออสการ์ dijo

    คำอธิบายที่ดีที่สุดที่ฉันเคยเห็นของนิพจน์ทั่วไป ขอขอบคุณผู้เขียนที่แบ่งปันงานนี้

    คำอวยพร

  16.   อเล็กเซเดอร์ dijo

    ฉันชอบคำอธิบายที่ดีมาก