คำถามติดแท็ก regular-expression

นิพจน์ทั่วไปเป็นวิธีการจับคู่รูปแบบของอักขระภายในสตริง

2
การแสดงออกปกติในสคริปต์ทุบตี
นี่เป็นครั้งแรกของฉันที่สคริปต์ทุบตีดังนั้นฉันอาจทำผิดพลาดง่าย โดยทั่วไปฉันพยายามเขียนสคริปต์ที่ได้รับกลุ่มของผู้ใช้และหากพวกเขาอยู่ในกลุ่มที่แน่นอนก็จะเข้าสู่ระบบตามนั้น เห็นได้ชัดว่ามีฟังก์ชั่นเพิ่มเติม แต่ไม่มีจุดที่สร้างเมื่อฉันไม่สามารถใช้ regex ได้! จนถึงตอนนี้ฉันมีสิ่งนี้: #!/bin/bash regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$" # example output groups="username : username usergroup" echo "$groups" >> /home/jrdn/log if [[ "$groups" =~ $regex ]]; then echo "Match!" >> /home/jrdn/log else echo "No match" >> /home/jrdn/log fi ทุกที่ที่ฉันลอง regex มันใช้งานได้ แต่ในสคริปต์ทุบตีมันเท่านั้นที่เคยออกผลลัพธ์เป็นตามด้วย$groups No matchดังนั้นใครบางคนสามารถบอกฉันว่ามีอะไรผิดปกติกับมัน?

3
คุณจะลบอักขระ dot ออกจากสตริงโดยไม่เรียกใช้ sed หรือ awk อีกครั้งได้อย่างไร
ฉันมีไฟล์ชื่อhostlist.txtที่มีข้อความเช่นนี้: host1.mydomain.com host2.mydomain.com anotherhost www.mydomain.com login.mydomain.com somehost host3.mydomain.com ฉันมีสคริปต์เล็ก ๆ ต่อไปนี้: #!/usr/local/bin/bash while read host; do dig +search @ns1.mydomain.com $host ALL \ | sed -n '/;; ANSWER SECTION:/{n;p;}'; done <hostlist.txt \ | gawk '{print $1","$NF}' >fqdn-ip.csv ซึ่งส่งออกไปที่fqdn-ip.csv: host1.mydomain.com.,10.0.0.1 host2.mydomain.com.,10.0.0.2 anotherhost.internal.mydomain.com.,10.0.0.11 www.mydomain.com.,10.0.0.10 login.mydomain.com.,10.0.0.12 somehost.internal.mydomain.com.,10.0.0.13 host3.mydomain.com.,10.0.0.3 คำถามของฉันคือฉันจะลบ.ก่อนจุลภาคโดยไม่ต้องกล่าวอ้างsedหรือgawkอีกครั้งหรือไม่ มีขั้นตอนที่ฉันสามารถแสดงในสายที่มีอยู่sedหรือgawkสายที่จะตัดจุดได้หรือไม่? hostlist.txt จะมีโฮสต์ 1,000 แห่งดังนั้นฉันต้องการให้สคริปต์ของฉันเร็วและมีประสิทธิภาพ

7
/ bin / dash: ตรวจสอบว่า $ 1 เป็นตัวเลขหรือไม่
อะไรจะเป็นวิธีที่ดีที่สุดในการตรวจสอบว่า $ 1 เป็นจำนวนเต็มใน / bin / dash หรือไม่ ในทุบตีฉันสามารถทำ: [[ $1 =~ ^([0-9]+)$ ]] แต่ดูเหมือนจะไม่เป็นไปตาม POSIX และ dash ไม่สนับสนุนสิ่งนั้น

4
Regexp ใน. ssh / config
ที่ทำงานฉันมักจะต้องเข้าสู่โฮสต์ที่เป็นไปตามรูปแบบการตั้งชื่อทั่วไปเช่นqc01- qc12, hc01- hc10และอื่น ๆ .ssh/configทั้งหมดของความต้องการเหล่านี้จะได้รับค่าคอนฟิกเดียวกันในแล็ปท็อปของฉัน แน่นอนว่าฉันสามารถใช้รายการสำหรับโฮสต์qc*และhc*แต่ฉันสงสัยว่าถ้าเป็นไปได้หรือไม่ที่จะใช้นิพจน์ทั่วไป

2
จำนวนแบ็กสแลชที่จำเป็นสำหรับการหลบหนีแบ็กสแลช regex บนบรรทัดรับคำสั่ง
ฉันเพิ่งมีปัญหากับ regex บางอย่างในบรรทัดคำสั่งและพบว่าสำหรับการจับคู่แบ็กสแลชสามารถใช้อักขระต่าง ๆ ได้ หมายเลขนี้ขึ้นอยู่กับการอ้างอิงที่ใช้สำหรับ regex (ไม่มีเครื่องหมายคำพูดเดี่ยว, เครื่องหมายคำพูดคู่) ดูเซสชั่นทุบตีต่อไปนี้สำหรับสิ่งที่ฉันหมายถึง: echo "#ab\\cd" > file grep -E ab\cd file grep -E ab\\cd file grep -E ab\\\cd file grep -E ab\\\\cd file #ab\cd grep -E ab\\\\\cd file #ab\cd grep -E ab\\\\\\cd file #ab\cd grep -E ab\\\\\\\cd file #ab\cd grep -E ab\\\\\\\\cd file …


3
การค้นหาปกติหรือการค้นหาไวด์การ์ด
เอกสาร Fedora พูดว่า: 5.2 การค้นหาขั้นสูง หากคุณไม่ทราบชื่อของแพ็คเกจให้ใช้การค้นหาหรือระบุตัวเลือก หรือใช้ไวด์การ์ดหรือนิพจน์ทั่วไปด้วยตัวเลือกการค้นหายำเพื่อขยายขอบเขตการค้นหา ตอนแรกฉันคิดว่านี่เป็นสิ่งที่ผิดหรือล้าสมัยเนื่องจากไม่มีไวยากรณ์ที่รู้จักของนิพจน์ทั่วไปที่จะใช้งานได้yum searchแต่จากนั้นฉันก็พบสิ่งนี้ : yum search [cl-*]ตัวอย่างเช่น แต่มันจะทำอะไรบางอย่างอย่างอื่น พบสิ่งที่ไม่มีตัวอักษร "c" หรือ "l" ในชื่อหรือคำอธิบาย (สิ่งที่ฉันต้องการคือการหาแพคเกจทั้งหมดที่มีชื่อจะถูกจับคู่โดยcl-.*regexp ฉันยังพบว่ามีคนไม่กี่คนที่แนะนำให้ผลลัพธ์ของไปป์ยำgrepซึ่งแน่นอนแก้ปัญหา แต่โดยหลักการแล้วฉันต้องการค้นหาสิ่งที่ทำในวงเล็บเหลี่ยมทำอะไร ถ้าหากyumสามารถค้นหาได้โดย regexp ล่ะ

3
ชนิดของเอ็นจินนิพจน์ทั่วไปประเภทใดที่ใช้ทุบตี
ฉันใช้RegEx Buddyเพื่อสร้างต้นแบบและดีบักนิพจน์ปกติของฉัน RegEx Buddy อนุญาตให้ฉันเลือกระหว่างชนิดของเอ็นจินนิพจน์ทั่วไปที่แตกต่างกันจำนวนหนึ่ง (. NET, Java, Perl, GNU BRE, GNU ERE, POSIX, BRE, POSIX ERE เป็นต้น) เอ็นจินนิพจน์ทั่วไปใดที่มีการใช้ bash (ตัวอย่างเช่นในifและcaseคำสั่ง) ฉันใช้ Centos 5.5 32 บิตและทุบตี 3.2.25 (1): [kevin@mon01 scratch]$ bash --version GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc. ฉันเดาว่ามันจะเป็น GNU BRE หรือ GNU ERE

2
คุณจะบันทึก regex ที่ซับซ้อนสำหรับการใช้ซ้ำหลายครั้งใน sed ได้อย่างไร
ในการใช้sedฉันมักจะสร้าง regexes ที่ค่อนข้างซับซ้อนและซับซ้อนซึ่งฉันต้องจับคู่สองครั้งในไฟล์ มีวิธีให้ฉันบันทึก regex นี้และเพียงแค่อ้างอิงสองครั้งหรือไม่ บางทีสิ่งที่มีลักษณะเช่นนี้? sed ' complicated_regex=/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+$/ s/complicated_regex:complicated_regex/simple-output/ ' my_file อัปเดต: คำตอบนำเสนอวิธีการใช้ตัวแปร bash มันใช้งานไม่ได้ test.txtที่กำหนด #test.txt foo bar bar foo และสคริปต์ #!/bin/bash VALUE='foo \([a-z]\+\)' sed 's/"${VALUE}"/foo happy \1/' test.txt สิ่งนี้ควรสร้างผลลัพธ์ foo happy bar bar foo แต่ฉันได้รับข้อผิดพลาดแทน sed: -e expression #1, char 24: invalid reference \1 on `s' …

3
Bash = ~ regex และ https://regex101.com/
ใช้https://regex101.com/ฉันสร้างนิพจน์ทั่วไปเพื่อส่งคืนที่อยู่ IP แรกในสตริง นิพจน์ทั่วไป: (?:\d{1,3}\.)+(?:\d{1,3}) RegExp รวมถึงตัวคั่น: /(?:\d{1,3}\.)+(?:\d{1,3})/ ด้วยสตริงทดสอบต่อไปนี้: eu-west 140.243.64.99 ส่งคืนการจับคู่แบบเต็มของ: 140.243.64.99 ไม่ว่าฉันจะลองกับสมอหรือไม่ก็ตามสคริปต์ทุบตีต่อไปนี้จะไม่ทำงานกับนิพจน์ทั่วไปที่สร้างขึ้น temp="eu-west 140.243.64.99 " regexp="(?:\d{1,3}\.)+(?:\d{1,3})" if [[ $temp =~ $regexp ]]; then echo "found a match" else echo "No IP address returned" fi

6
ฉันจะแยก / แยกวิเคราะห์ URL ที่สมบูรณ์จากสตริงแบบกึ่งสุ่มได้อย่างไร
ฉันต้องการ bash parse / แยก URL แบบเต็ม (และเฉพาะ URL) จากสตริงสั้นแบบสุ่ม ตัวอย่าง: bob, the address is http://www.google.com หรือ https://foo.com/category/example.html is up หรือ Error 123 occurred at http://bit.ly/~1223456677878 หรือ Stats are up: https://foo1234.net/report.jpg ฉันลองใช้cat foo_output | egrep -o "https?://[\w'-\.]*\s"แต่ดูเหมือนจะไม่ทำงาน

2
[[.ch.]] หมายถึงอะไรใน regex?
ชื่อสำรอง: "ลำดับการเรียง" หรือ "องค์ประกอบเรียง" ใน regex ที่สอดคล้องกับ POSIX คืออะไร ฉันพบข้อกำหนดทางเทคนิคที่แน่นอนในส่วน 9.3.5 ของข้อกำหนด POSIXตามรายการ # 4 ในรายการ แต่ไม่ชัดเจนสำหรับฉัน ฉัน googled รอบบนเว็บสำหรับตัวอย่างและคำอธิบายและมาไม่สมบูรณ์มือเปล่า แต่ที่แน่ ๆ ไม่ได้รู้แจ้ง สิ่งเดียวที่ฉันได้รับคือในบางสถานการณ์คุณสามารถทำให้ regex ปฏิบัติกับตัวละครหลาย ๆ ตัวราวกับเป็นตัวละครเดียวเพื่อการเปรียบเทียบความยาวและกำหนดว่า "การจับคู่ที่ยาวที่สุด" คืออะไร (เนื่องจาก regexes เป็นโลภและ ส่งคืนการจับคู่ที่ยาวที่สุดที่เป็นไปได้) นั่นคือทั้งหมดใช่มั้ย ฉันมีปัญหาในการเห็นการใช้งาน แต่ฉันสงสัยว่าความเข้าใจของฉันไม่สมบูรณ์ สิ่งที่จริง "เรียง" สำหรับ regex คืออะไร? และ[[.ch.]]ตัวอย่างใน POSIX specs เกี่ยวข้องกับสิ่งนี้อย่างไร

5
วิธีการพิมพ์เนื้อหาไฟล์เฉพาะในกรณีที่บรรทัดแรกตรงกับรูปแบบที่แน่นอน?
ฉันกำลังเขียนสคริปต์ฉันต้องการตรวจสอบว่าบรรทัดแรกของไฟล์ตรงกับรูปแบบที่กำหนดหรือไม่และถ้าพิมพ์ออกมาเป็นไฟล์หรือไม่ ฉันจะบรรลุสิ่งนี้ได้อย่างไร ฉันจะตรวจสอบรูปแบบได้อย่างไร มีวิธีตรวจสอบรูปแบบและทำตามสิ่งที่ส่งออกหรือไม่ .. แก้ไข: โปรดดูคำถามนี้: /programming/5536018/how-to-get-match-regex-pattern-using-awk-from-file ฉันต้องการสิ่งนี้ แต่ไม่มีใครทำงานให้ฉันได้ โดยทั่วไปฉันต้องการตรวจสอบว่าบรรทัดแรกตรงกับรูปแบบ regex หรือไม่และขึ้นอยู่กับว่าพิมพ์บรรทัดของไฟล์

3
ประวัติของทุบตี Bash
มีเหตุผลทางประวัติศาสตร์หรือไม่ทำไม Bash "globbing" และการแสดงออกปกติไม่เหมือนกัน? ตัวอย่างเช่นฉันเชื่อว่าใน Bash [1-2]*ตรงกับสิ่งที่เริ่มต้นด้วย 1 หรือ 2 ตามด้วยสิ่งอื่นในขณะที่นิพจน์ทั่วไป[1-2]*จะจับคู่เฉพาะลำดับที่ 1 และ 2 การเขียนสคริปต์ Bash และ REGEX ของฉันนั้นค่อนข้างอ่อนแอและฉันพบปัญหาที่เกี่ยวข้องกับความแตกต่างเหล่านี้เป็นประจำซึ่งทำให้ฉันสงสัยว่าทำไมพวกเขาถึงแตกต่างกัน


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