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

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

4
ฉันจะ grep สำหรับสิ่งนี้หรือว่า (2 สิ่ง) ในไฟล์ได้อย่างไร
ฉันมีไฟล์ที่มี "แล้ว" และ "มี" ของ ฉันสามารถ $ grep "then " x.x x and then some x and then some x and then some x and then some และฉันสามารถ $ grep "there " x.x If there is no blob none some will be created ฉันจะค้นหาทั้งสองอย่างในการดำเนินการเดียวได้อย่างไร ฉันเหนื่อย $ grep (then|there) x.x -bash: …

4
ความแตกต่างระหว่าง [0-9], [[: digit:]] และ \ d
ในบทความวิกิพีเดียนิพจน์ปกติมันก็ดูเหมือนว่า[[:digit:]]= = [0-9]\d สถานการณ์อะไรบ้างที่พวกเขาไม่เท่ากัน? อะไรคือความแตกต่าง? หลังจากการวิจัยบางอย่างฉันคิดว่าความแตกต่างอย่างหนึ่งคือการแสดงออกของวงเล็บปีกกา[:expr:]ขึ้นอยู่กับสถานที่

4
เป็นกลุ่ม - วิธีการแทนที่หนึ่งบรรทัดใหม่ \ n ด้วยสอง \ n's
ในโปรแกรมแก้ไข vim ฉันต้องการแทนที่อักขระขึ้นบรรทัดใหม่ (\ n) ด้วยอักขระบรรทัดใหม่สองตัว (\ n \ n) โดยใช้โหมดคำสั่ง vim เนื้อหาไฟล์อินพุต: This is my first line. This is second line. คำสั่งที่ฉันพยายาม: :%s/\n/\n\n/g มันจะแทนที่สตริงด้วยอักขระที่ไม่ต้องการเช่น This is my first line.^@^@This is second line.^@^@ จากนั้นฉันลองคำสั่งต่อไปนี้ :%s/\n/\r\r/g มันทำงานอย่างถูกต้อง คุณช่วยอธิบายได้ไหมว่าทำไมมันถึงใช้ได้ดีกับคำสั่งที่สอง?

2
grep และหนีเครื่องหมายดอลลาร์
$Id$ฉันต้องการที่จะทราบว่ามีไฟล์สตริง grep \$Id\$ my_dir/mylist_of_files ส่งกลับค่าที่เกิดขึ้น 0 ฉันค้นพบว่าฉันต้องใช้ grep \$Id$ my_dir/mylist_of_files จากนั้นฉันจะเห็นว่า$Idมีสีในเอาต์พุตนั่นคือมันถูกจับคู่ ฉันจะจับคู่ที่สองได้อย่างไร$และทำไมไม่\$Id\$ทำงาน ไม่สำคัญว่าตัวที่สอง$จะเป็นตัวละครตัวสุดท้ายหรือไม่ ฉันใช้grep2.9 ก่อนโพสต์คำถามของฉันฉันใช้ google ... ฉันพบคำตอบ หากต้องการค้นหา $ (เครื่องหมายดอลลาร์) ในไฟล์ชื่อ test2 ให้ป้อน: grep \\ $ test2 จำเป็นต้องใช้อักขระ \\ (double backslash) เพื่อบังคับให้เชลล์ส่ง a \ $ (เครื่องหมายแบ็กสแลชเดี่ยว, เครื่องหมายดอลลาร์) ไปยังคำสั่ง grep อักขระ \ (แบ็กสแลชเดี่ยว) บอกให้คำสั่ง grep ปฏิบัติต่ออักขระต่อไปนี้ (ในตัวอย่างนี้ $) เป็นตัวอักษรมากกว่าอักขระนิพจน์ ใช้คำสั่ง …

6
ตรวจสอบว่าหมายเลขอินพุตเป็นจำนวนเต็มหรือไม่
ฉันพยายามตรวจสอบว่าการป้อนข้อมูลเป็นจำนวนเต็มหรือไม่และฉันผ่านไปหลายร้อยครั้ง แต่ไม่เห็นข้อผิดพลาดในสิ่งนี้ อนิจจามันไม่ทำงานมันเป็นต้นเหตุของคำสั่ง if สำหรับอินพุตทั้งหมด (ตัวเลข / ตัวอักษร) read scale if ! [[ "$scale" =~ "^[0-9]+$" ]] then echo "Sorry integers only" fi ฉันเล่นด้วยคำพูด แต่ก็ไม่ได้ทำหรือไม่ทำอะไรเลย ฉันทำอะไรผิด มีวิธีที่ง่ายกว่าในการทดสอบว่าอินพุตเป็นเพียงจำนวนเต็มหรือไม่?

3
แทนที่ด้วย VIM นำส่วนการค้นหารูปแบบกลับมาใช้ใหม่
ฉันกำลังทำงานกับVImและพยายามตั้งค่าการค้นหาและแทนที่คำสั่งเพื่อทำการทดแทนบางอย่างซึ่งฉันสามารถใช้นิพจน์ปกติที่เป็นส่วนหนึ่งของสตริงการค้นหาของฉันได้อีกครั้ง ตัวอย่างง่ายๆจะเป็นบรรทัดที่ฉันต้องการที่จะเปลี่ยน(10)ไป{10}ที่ 10 สามารถเป็นตัวเลขใด ๆ ฉันมาไกลขนาดนี้ .s/([0-9]*)/what here??/ ซึ่งตรงกับส่วนที่ฉันต้องการ ตอนนี้ฉันพยายามแทน .s/([0-9]*)/{\0}/ แต่นี่ให้เป็นผลลัพธ์ {(10)} จากนั้นฉันก็ลอง .s/(\zs[0-9]*\ze)/{\0}/ อย่างไรก็ตามนั่นทำให้ฉัน({10})ซึ่งฉันก็ปิด แต่ไม่ใช่สิ่งที่ฉันต้องการ ฉันคิดว่าฉันต้องการการทำเครื่องหมาย / การอ้างอิงกลับแบบอื่นแทนการทำสิ่งนี้\0แต่ฉันไม่รู้ว่าจะต้องดูที่ไหน ดังนั้นคำถามคือสิ่งนี้สามารถทำได้เป็นกลุ่มและถ้าเป็นเช่นนั้นได้อย่างไร

5
การสลับ Regex / หรือโอเปอเรเตอร์ (foo | bar) ใน GNU หรือ BSD Sed
ฉันไม่สามารถทำงานได้ เอกสารของ GNU sed บอกว่าจะหลบหนีไปป์ แต่นั่นไม่ได้ผลหรือใช้ไพพ์แบบตรงโดยไม่ต้องหลบหนี เพิ่ม parens ทำให้ไม่มีความแตกต่าง $ echo 'cat dog pear banana cat dog' | sed 's/cat|dog/Bear/g' cat dog pear banana cat dog $ echo 'cat dog pear banana cat dog' | sed 's/cat\|dog/Bear/g' cat dog pear banana cat dog

2
LC_COLLATE (ควร) มีผลกับช่วงอักขระหรือไม่
ลำดับการเรียงผ่านLC_COLLATEกำหนดไม่เพียงเรียงลำดับของอักขระแต่ละตัวเท่านั้น แต่ยังรวมถึงความหมายของช่วงอักขระด้วย หรือไม่ พิจารณาตัวอย่างต่อไปนี้: unset LANGUAGE LC_ALL echo B | LC_COLLATE=en_US grep '[a-z]' สังหรณ์ใจBไม่ได้อยู่ใน[a-z]ดังนั้นสิ่งนี้ไม่ควรส่งออกอะไร นั่นคือสิ่งที่เกิดขึ้นบน Ubuntu 8.04 หรือ 10.04 แต่ในบางเครื่องทำงาน Debian Lenny หรือบีบBพบเพราะช่วงa-zรวมถึงทุกอย่างที่ระหว่างaและzเพื่อเปรียบเทียบรวมทั้งตัวอักษรทุนผ่านBZ ระบบทั้งหมดที่ทำการทดสอบจะมีen_USสถานที่เกิดขึ้น ฉันยังพยายามที่แตกต่างกันสถานที่เกิดเหตุ: ในเครื่องที่Bจะถูกจับคู่ข้างต้นเดียวกันที่เกิดขึ้นในสถานบริการทุก (ส่วนใหญ่เป็นภาษาลาตินตาม: {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}ยังสถานที่ภาษาจีน) ยกเว้นญี่ปุ่น (ในการเข้ารหัสใด ๆ ) และ/CPOSIX ช่วงของอักขระหมายความว่าอย่างไรในนิพจน์ทั่วไปเมื่อคุณไปเกิน ASCII เหตุใดจึงมีความแตกต่างระหว่างการติดตั้ง Debian บางอย่างในมือข้างหนึ่งและการติดตั้ง Debian อื่น ๆ และ Ubuntu ในอีกด้านหนึ่ง? ระบบอื่นทำงานอย่างไร? ใครถูกและใครควรจะรายงานบั๊ก? (โปรดทราบว่าฉันถามเกี่ยวกับพฤติกรรมของช่วงอักขระเช่น[a-z]ในen_USตำแหน่งที่ตั้งโดยเฉพาะอย่างยิ่งในระบบที่ใช้ libc เป็นหลัก GNU …

11
จะต้องมีวิธีที่ดีกว่าในการแทนที่บรรทัดใหม่เดียวเท่านั้นหรือ
ฉันติดนิสัยการเขียนหนึ่งบรรทัดต่อประโยคเพราะปกติแล้วฉันจะรวบรวมสิ่งต่าง ๆ ให้กับ LaTex หรือฉันกำลังเขียนในรูปแบบอื่นที่มีการละเว้นบรรทัด ฉันใช้บรรทัดว่างเพื่อระบุจุดเริ่มต้นของย่อหน้าใหม่ ตอนนี้ฉันมีไฟล์ที่เขียนในลักษณะนี้ซึ่งฉันต้องการส่งเป็นข้อความธรรมดา ฉันต้องการที่จะลบ linebreaks เดียวทั้งหมด แต่ปล่อยให้ linebreaks สองครั้งเหมือนเดิม นี่คือสิ่งที่ฉันทำ: sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt สิ่งนี้แทนที่บรรทัดว่างด้วยข้อความบางอย่างที่ฉันมั่นใจว่าจะไม่ปรากฏในไฟล์: NEWLINEจากนั้นมันจะกำจัดตัวแบ่งบรรทัดทั้งหมดด้วย awk (ฉันพบเคล็ดลับในบางเว็บไซต์) จากนั้นมันจะแทนที่NEWLINEs ด้วยบรรทัดที่จำเป็นสองบรรทัด . ดูเหมือนว่าจะเป็นวิธีที่ยืดยาวในการทำสิ่งที่เรียบง่าย มีวิธีที่ง่ายกว่านี้ไหม? นอกจากนี้หากมีวิธีการแทนที่ช่องว่างหลาย ๆ ช่อง (ซึ่งบางครั้งอาจคืบไปด้วยเหตุผลบางอย่าง) ด้วยช่องว่างเดียวนั่นก็จะดีเช่นกัน ฉันใช้ emacs ดังนั้นหากมีเคล็ดลับเฉพาะของ emac ที่ดี แต่ฉันอยากเห็นรุ่นที่บริสุทธิ์หรือรุ่น awk ที่บริสุทธิ์

7
วิธีการเลือกการเกิดขึ้นครั้งแรกระหว่างสองรูปแบบรวมถึงพวกเขา
ฉันจะเลือกสิ่งที่เกิดขึ้นครั้งแรกระหว่างสองรูปแบบรวมถึงพวกเขา ควรใช้หรือsedawk ฉันมี: text something P1 something content1 content2 something P2 something text something P1 something content3 content4 something P2 something text ฉันต้องการเกิดขึ้นครั้งแรกของเส้นระหว่าง P1 และ P2 (รวมถึงสาย P1 และสาย P2): something P1 something content1 content2 something P2 something

3
วิธีใช้ [\ w] + ในการแสดงออกปกติใน sed?
ฉันอยู่บน Windows แต่ฉันเดาว่าคำถามของฉันยังคงอยู่ที่นี่ C:\Users\User>grep --version GNU grep 2.6.3 C:\Users\User>sed --version GNU sed version 4.2.1 ฉันสังเกตเห็นว่างานต่อไปนี้ (การแสดงผลhere): echo here | grep -E "\w+" echo here | grep -E "[her]+" แต่สิ่งนี้ไม่ทำงาน (ไม่แสดงผลอะไร): echo here | grep -E "[\w]+" สิ่งนี้จะทำอีกครั้ง (การส่งออกhere): echo here | grep -P "[\w]+" ดังนั้น[\w]สิ่งที่เฉพาะเจาะจงกับการแสดงออกปกติ Perl ฉันคิดว่า ถูกต้องไหม งั้นมาพูดsedกัน งานนี้ …

9
ฉันจะ“ grep” รูปแบบข้ามหลายบรรทัดได้อย่างไร?
ดูเหมือนว่าฉันใช้ผิดวัตถุประสงค์grep/ egrep. ฉันพยายามค้นหาสตริงในหลายบรรทัดและไม่สามารถหาคู่ที่ตรงกันในขณะที่ฉันรู้ว่าสิ่งที่ฉันกำลังมองหาควรจับคู่ แต่เดิมฉันคิดว่า regexes ของฉันผิด แต่ในที่สุดฉันก็อ่านว่าเครื่องมือเหล่านี้ทำงานต่อบรรทัด (เช่นเดียวกับ regexes ของฉันมันช่างน่ารำคาญเหลือเกิน ดังนั้นเครื่องมือใดที่จะใช้ในการค้นหารูปแบบข้ามหลายบรรทัด?

6
Regex สำหรับคำ 10 ตัวอักษรทั้งหมดด้วยตัวอักษรที่ไม่ซ้ำกัน
ฉันพยายามเขียน regex ที่จะแสดงคำทั้งหมดที่มีความยาว 10 ตัวอักษรและไม่มีตัวอักษรซ้ำ จนถึงตอนนี้ฉันได้รับ grep --colour -Eow '(\w{10})' ซึ่งเป็นส่วนแรกของคำถาม ฉันจะตรวจสอบหา "เอกลักษณ์" ได้อย่างไร ฉันไม่มีเบาะแสนอกเหนือจากนั้นฉันต้องใช้การอ้างอิงกลับ

5
ในการแสดงออกปกติตัวละครใดต้องหลบหนี
โดยทั่วไปแล้วอักขระใดในนิพจน์ทั่วไปที่ต้องหลบหนี ตัวอย่างเช่นต่อไปนี้ไม่ถูกต้องทางไวยากรณ์: echo '[]' | grep '[]' grep: Unmatched [ or [^ อย่างไรก็ตามสิ่งนี้ถูกต้องตามหลักไวยากรณ์: echo '[]' | grep '\[]' [] มีเอกสารใดบ้างที่ควรหลีกเลี่ยงอักขระในนิพจน์ทั่วไปและไม่ควรใช้?

5
ค้นหาหมายเลขเป็นกลุ่มที่มีจำนวนหลักเฉพาะ
ฉันต้องการค้นหาหมายเลขความยาวเฉพาะในเอกสารขนาดใหญ่ ฉันพยายามใช้ regex สำหรับสิ่งนี้ ตัวอย่างเช่นหากฉันต้องการค้นหาตัวเลขด้วยตัวเลข 2 หลักฉันจะใช้\d\d(เช่น / d สองครั้งตามด้วยช่องว่าง) มันใช้งานได้ดี แต่สำหรับการค้นหาตัวเลข 10 หลักนั้นเป็นไปไม่ได้ที่จะพิมพ์ใน\d10 ครั้ง พยายาม\d{2}พูดว่า ' E486: ไม่พบรูปแบบ: \ d {2} ' มีวิธีที่เร็วกว่า / ง่ายกว่าในการบรรลุเป้าหมายนี้หรือไม่?

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