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

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

13
ฉันจะ grep สำหรับรูปแบบหลายรูปแบบโดยมีรูปแบบที่มีอักขระไพพ์ได้อย่างไร
ฉันต้องการค้นหาทุกบรรทัดในไฟล์หลายไฟล์ที่ตรงกับหนึ่งในสองรูปแบบ ฉันพยายามค้นหารูปแบบที่ฉันต้องการโดยพิมพ์ grep (foo|bar) *.txt แต่เชลล์ตีความ|ว่าbarเป็นไพพ์และบ่นเมื่อไม่มีการปฏิบัติการ ฉันจะ grep สำหรับหลายรูปแบบในไฟล์ชุดเดียวกันได้อย่างไร?

8
grep สามารถส่งออกเฉพาะกลุ่มที่ระบุที่ตรงกันหรือไม่
บอกว่าฉันมีไฟล์: # file: 'test.txt' foobar bash 1 bash foobar happy foobar ฉันแค่อยากรู้ว่าคำใดปรากฏหลัง "foobar" ดังนั้นฉันสามารถใช้ regex นี้: "foobar \(\w\+\)" วงเล็บแสดงว่าฉันมีความสนใจเป็นพิเศษในคำทันทีหลังจาก foobar แต่เมื่อฉันทำgrep "foobar \(\w\+\)" test.txtฉันจะได้ทั้งบรรทัดที่ตรงกับ regex ทั้งหมดมากกว่าเพียงแค่ "คำหลังจาก foobar": foobar bash 1 foobar happy ฉันชอบที่ผลลัพธ์ของคำสั่งนั้นจะเป็นดังนี้: bash happy มีวิธีบอก grep ให้แสดงเฉพาะรายการที่ตรงกับการจัดกลุ่ม (หรือการจัดกลุ่มเฉพาะ) ในนิพจน์ทั่วไปหรือไม่?


14
ฉันจะใช้ sed เพื่อแทนที่สตริงหลายบรรทัดได้อย่างไร
ฉันสังเกตเห็นว่าถ้าฉันเพิ่ม\nรูปแบบสำหรับการทดแทนโดยใช้sedมันไม่ตรงกัน ตัวอย่าง: $ cat > alpha.txt This is a test Please do not be alarmed $ sed -i'.original' 's/a test\nPlease do not/not a test\nBe/' alpha.txt $ diff alpha.txt{,.original} $ # No differences printed out ฉันจะทำให้เรื่องนี้ทำงานได้อย่างไร


8
วิธีการเรียกใช้ grep ที่มีหลายรูปแบบและ?
ฉันต้องการได้รับการจับคู่หลายรูปแบบโดยนัยและระหว่างรูปแบบเช่นเทียบเท่ากับการรัน greps หลายตัวตามลำดับ: grep pattern1 | grep pattern2 | ... ดังนั้นวิธีการแปลงเป็นบางอย่างเช่น? grep pattern1 & pattern2 & pattern3 ฉันต้องการใช้ grep เดี่ยวเพราะฉันกำลังสร้างข้อโต้แย้งแบบไดนามิกดังนั้นทุกอย่างต้องพอดีในสายเดียว การใช้ตัวกรองคือคุณสมบัติของระบบไม่ใช่ grep ดังนั้นจึงไม่ใช่ข้อโต้แย้ง อย่าสับสนคำถามนี้ด้วย: grep "pattern1\|pattern2\|..." นี่คือการจับคู่รูปแบบOR หรือหลายแบบ

7
ใช้ sed เพื่อค้นหาและแทนที่สตริงที่ซับซ้อน (ดีกว่าด้วย regex)
ฉันมีไฟล์ที่มีเนื้อหาดังต่อไปนี้: <username><![CDATA[name]]></username> <password><![CDATA[password]]></password> <dbname><![CDATA[name]]></dbname> และฉันต้องสร้างสคริปต์ที่เปลี่ยน "ชื่อ" ในบรรทัดแรกเป็น "บางอย่าง", "รหัสผ่าน" ในบรรทัดที่สองเป็น "someelse" และ "ชื่อ" ในบรรทัดที่สามเป็น "somethingdifferent" ฉันไม่สามารถพึ่งพาลำดับของสิ่งที่เกิดขึ้นเหล่านี้ในไฟล์ดังนั้นฉันจึงไม่สามารถแทนที่ "ชื่อ" ด้วย "บางอย่าง" เป็นครั้งแรกและเกิดขึ้นเป็นครั้งที่สองของ "ชื่อ" ด้วย "somethingdifferent" ฉันต้องค้นหาสตริงโดยรอบเพื่อให้แน่ใจว่าฉันค้นหาและแทนที่สิ่งที่ถูกต้อง จนถึงตอนนี้ฉันได้ลองคำสั่งนี้เพื่อค้นหาและแทนที่เหตุการณ์ "ชื่อ" แรก: sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml อย่างไรก็ตามมันไม่ทำงานดังนั้นฉันจึงคิดว่าตัวละครบางตัวอาจต้องหลบหนี ฯลฯ โดยหลักการแล้วฉันยินดีที่จะใช้ regex เพียงแค่จับคู่ "ชื่อผู้ใช้" สองครั้งและแทนที่ "ชื่อ" เท่านั้น บางอย่างเช่นนี้ แต่ด้วยsed: <username>.+?(name).+?</username> และแทนที่เนื้อหาในวงเล็บด้วย "บางอย่าง" เป็นไปได้ไหม

1
ทำไมนิพจน์ปกติของฉันทำงานใน X แต่ไม่ใช่ใน Y
ฉันเขียนนิพจน์ปกติซึ่งทำงานได้ดีในบางโปรแกรม (grep, sed, awk, perl, python, ruby, ksh, bash, zsh, หา, emacs, vi, vim, gedit, …) แต่เมื่อฉันใช้มันในโปรแกรมอื่น (หรือตัวแปร unix ที่แตกต่างกัน) มันหยุดจับคู่ ทำไม?


2
ปัญหา regex ของ grep 'OR'
ฉันพยายามใช้ grep กับ regex เพื่อค้นหาบรรทัดในไฟล์ที่ตรงกับ 1 ใน 2 สตริงที่เป็นไปได้ นี่คือ grep ของฉัน: $ grep "^ID.*(ETS|FBS)" my_file.txt grep ด้านบนไม่แสดงผลลัพธ์ใด ๆ อย่างไรก็ตามหากฉันดำเนินการอย่างใดอย่างหนึ่ง: $ grep "^ID.*ETS" my_file.txt หรือ $ grep "^ID.*FBS" my_file.txt ฉันจะจับคู่บรรทัดที่เฉพาะเจาะจง เพราะเหตุใด OR regex ของฉันจึงไม่ตรงกัน ขอบคุณล่วงหน้าสำหรับความช่วยเหลือ!

5
วิธีกระจายไฟล์โดยไม่คำนึงถึงความคิดเห็น (บรรทัดที่ขึ้นต้นด้วย #)
ฉันมีไฟล์กำหนดค่าสองไฟล์ต้นฉบับจากผู้จัดการแพ็กเกจและไฟล์ที่กำหนดเองที่แก้ไขด้วยตัวเอง ฉันได้เพิ่มความคิดเห็นเพื่ออธิบายพฤติกรรม ฉันจะรันdiffไฟล์กำหนดค่าโดยข้ามความคิดเห็นได้อย่างไร บรรทัดความคิดเห็นถูกกำหนดโดย: ช่องว่างนำหน้าตัวเลือก (แท็บและช่องว่าง) เครื่องหมายแฮช ( #) ตัวละครอื่น ๆ (ที่ง่ายที่สุด) #.*การแสดงออกปกติข้ามความต้องการแรกจะเป็น ฉันลองตัวเลือก--ignore-matching-lines=RE( -I RE) ของ GNU diff 3.0 แต่ฉันไม่สามารถทำงานกับ RE นั้นได้ ฉันยังพยายาม.*#.*และ.*\#.*ไม่มีโชค การวางบรรทัด ( Port 631) ตามตัวอักษรอย่างแท้จริงREไม่ตรงกับสิ่งใดเลยและไม่ช่วยให้วาง RE ระหว่างเครื่องหมายทับ ตามที่แนะนำในregex แล้วรสชาติของเครื่องมือ“ diff” นั้นขาดไปหรือไม่? ฉันพยายามgrep -G: grep -G '#.*' file นี้ดูเหมือนว่าจะตรงกับความเห็น diff -I '#.*' file1 file2แต่มันไม่ทำงานสำหรับ ดังนั้นควรใช้ตัวเลือกนี้อย่างไร ฉันจะdiffข้ามบางบรรทัดได้อย่างไร (ในกรณีของฉันความคิดเห็น) …


7
ค้นหาไฟล์ในหลายชื่อโฟลเดอร์
ฉันพยายามที่จะรายการไฟล์ทั้งหมดจากdir1, dir2, dir3และdir4ซึ่งอาจจะเป็นที่ใดก็ได้ในเป็นไดเรกทอรีย่อยของฉันcwdโดยใช้findคำสั่ง ฉันพยายามต่อไปนี้โดยไม่ประสบความสำเร็จ: find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+' ฉันพยายามposix-extendedเช่นกัน ฉันจะแสดงรายการไฟล์เหล่านี้ได้อย่างไร

9
การเปลี่ยนแท็บอย่างง่าย ๆ ล้มเหลวอย่างลึกลับ
นี่ควรจะง่ายจริงๆ แต่ด้วยเหตุผลบางอย่างมันไม่ทำงาน: sed -i.bak -E 's/\t/ /' file.txt แทนที่จะเป็นการแทนที่อักขระแท็บมันเป็นการแทนที่tอักขระ ฉันลองทุกรูปแบบเกี่ยวกับเรื่องนี้ฉันสามารถคิดถึงเล่นกับข้อความ ฯลฯ ฉัน Googled และพบคนอื่น ๆ ที่ใช้คำพูดที่คล้ายกันและดูเหมือนว่าพวกเขาจะได้ผลสำหรับพวกเขา สิ่ง-Eนี้เป็น OS X ฉันคิดว่าความล้มเหลวอาจเป็นผลมาจากการเล่นโวหารแปลก ๆ ของ OS X sedดังนั้นฉันจึงลองใช้กับ Ruby เช่นกัน (ไม่ใส่-i) และได้รับผลลัพธ์เดียวกัน: ruby -pe '$_.gsub!(/\t/," ")' < file.txt > file.new ฉันใช้ Bash 3.2.51 บน OS X และ iTerm ถึงแม้ว่าฉันจะไม่เห็นว่าสิ่งเหล่านี้จะเกี่ยวข้องกันมากเพียงใด ฉันไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมแปลก ๆ แต่ฉันสามารถโพสต์สิ่งที่คุณคิดว่าอาจเกี่ยวข้อง มีอะไรผิดปกติ? …

6
การแทนที่หลายบรรทัดว่างด้วยบรรทัดว่างเดี่ยวใน vim / sed
คำถามไม่มากก็น้อยบอกว่ามันทั้งหมด ฉันทราบว่า/^$/dจะลบบรรทัดว่างทั้งหมด แต่ฉันไม่เห็นวิธีพูดว่า 'แทนที่บรรทัดว่างสองบรรทัดขึ้นไปด้วยบรรทัดว่างเดียว' ความคิดใด ๆ

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