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

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

3
Regex & Sed / Perl: จับคู่คำที่ไม่นำหน้าด้วยคำอื่น
ฉันต้องการใช้sedหรือperlแทนที่คำทั้งหมดที่ไม่มีคำที่อยู่ข้างหน้า ตัวอย่างเช่นฉันมีไฟล์ข้อความที่มีเนื้อเรื่องของภาพยนตร์และฉันต้องการที่จะแทนที่นามสกุลของตัวละครทุกตัวด้วยชื่อของพวกเขา แต่เฉพาะในกรณีที่ชื่อของพวกเขาไม่ได้มาก่อนนามสกุลของพวกเขา ข้อความตัวอย่างอาจมีลักษณะเช่นนี้: John Smith and Jane Johnson talk about Smith's car. ฉันอยากให้มันเป็นแบบนี้: John Smith and Jane Johnson talk about John's car. ถ้าฉันแค่ทำsed 's/Smith/John/' fileแล้วฉันจะมี: John John and Jane Johnson talk about John's car. ชื่อแรกที่มาก่อนนามสกุลจะเหมือนกันเสมอ ฉันไม่ได้มีการจัดการกับและJohn Smith Frank Smithฉันต้องการวิธีการจับคู่Smithที่ไม่ได้นำJohnหน้า



2
ทำไมฉันต้องหลบหนีอักขระ regex ใน sed เพื่อตีความว่าเป็นอักขระ regex
ดูเหมือน cat sed_data.txt | sed 's/\b[0-9]\{3\}\b/NUMBER/g' ว่าฉันจะต้องหลบหนีตัวละครเพื่อสร้างการแสดงออกปกติ ในกรณีนี้ฉันต้องหลบหนีเครื่องมือจัดฟันเพื่อที่จะตีความได้หลายครั้ง ทำไม? ฉันคาดหวังว่าทุกอย่างจะเป็นตัวละคร regex เว้นแต่จะหลบหนี นั่นคือสิ่งที่ตรงกันข้าม

4
เปลี่ยนชื่อไดเรกทอรีย่อยซ้ำ ๆ ที่ตรงกับ regex
Seriesฉันมีเซิร์ฟเวอร์สื่อที่มีโฟลเดอร์ที่เรียกว่า ( /media/Expansion2/Series/) ในนั้นฉันมี (แปลกใจ!) ทีวีซีรีส์ เหล่านี้เป็นเพียงชื่อที่แสดงเช่น/media/Expansion2/Series/The Big Bang Theory/ ภายในโฟลเดอร์ของแต่ละรายการ (และนี่คือปัญหาที่เกิดขึ้น) ฉันมีโฟลเดอร์ซีซัน ขณะนี้ฉันมีการผสมผสานของ 2 อนุสัญญาต่อไปนี้ (รวมถึงอีกสองสามข้อ): /media/Expansion2/Series/The Big Bang Theory/The Big Bang Theory Season 1 /media/Expansion2/Series/The Big Bang Theory/Season 2 Season #ในท้ายที่สุดผมต้องการที่จะเปลี่ยนชื่อโฟลเดอร์ทั้งหมดเพียง เป็น regex ฉันอาจจะพูดอะไรบางอย่างเช่น s/.*(Season \d)/$1 ใช้ได้กับโฟลเดอร์เท่านั้นไม่ใช่ไฟล์ ฉันควรจะพูดถึงว่านี่เป็นโฟลเดอร์ย่อยประมาณ 50+ รายการดังนั้นจึงต้องเริ่มที่/media/Expansion2/Series/ระดับและดูในแต่ละซีรีย์ :)

5
การใช้งาน regexp แบบขยายเพื่อเพิ่มจำนวนตัวแปรของศูนย์นำหน้าตามตำแหน่งในสตริง
ฉันมีปัญหาในการทำให้ซิงก์ของฉันช้าลงเพื่อเพิ่มตัวเลขนำหน้าจำนวนหนึ่งให้กับรูปแบบองค์กรตัวเลข สตริงที่ฉันกำลังทำงานอยู่นั้นดูเหมือนว่า 1.1.1.1,Some Text Here ใช้ประโยชน์จากไวยากรณ์ซิด sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr" ฉันสามารถกระตุ้นการตอบสนองได้ 01.01.01.01,Some Text Here อย่างไรก็ตามสิ่งที่ฉันกำลังมองหาคือสิ่งที่เติมศูนย์ถึง 2 หลักในฟิลด์ 2 และ 3 และ 3 และ 3 หลักในฟิลด์ 4 เพื่อให้รายการทั้งหมดมีความยาวมาตรฐานที่ [0-9] [0-9] { 2}. [0-9] {2}. [0-9] {3} 1.01.01.001,Some Text Here สำหรับชีวิตของฉันฉันไม่สามารถคิดได้ถึงวิธีการปรับเปลี่ยนขอบเขตเพื่อรวมพารามิเตอร์ที่จำเป็นในการถ่ายภาพเป็นตัวเลขเท่านั้นหลังจากระยะ ฉันคิดว่ามันมีบางอย่างเกี่ยวกับการใช้ \ b ซึ่งฉันเข้าใจการจับคู่ศูนย์อักขระที่ขอบเขตคำ แต่ฉันไม่เข้าใจว่าทำไมความพยายามของฉันในการเพิ่มช่วงเวลาในการแข่งขันล้มเหลวดังนี้: sed -r ":r;s/\.\b[0-9]{1,$((1))}\b/0&/g;tr" sed -r ":r;s/\b\.[0-9]{1,$((1))}\b/0&/g;tr" Both …

2
การจับคู่อักขระพิเศษด้วยนิพจน์ปกติ
พูดว่าง่ายมากถ้าฉันต้องการค้นหาบางอย่างที่มีตัวอักษรและตัวพิมพ์เล็ก Produc_text | grep -E '[0-9a-z]' วงเล็บมีประโยชน์ในการจับคู่ชุดอักขระ แต่สิ่งที่เกี่ยวกับสิ่งที่ค่อนข้างพิเศษ? ถ้าผมต้องการที่จะใช้วงเล็บตรงกับใด ๆของตัวละครแต่อย่างใดอย่างหนึ่งต่อไปนี้: วงเล็บปิด]เส้นประ (หรือยัติภังค์) "-" ทั้งทับ/และ\, เครื่องหมาย^, :ลำไส้ใหญ่ มันจะเป็นแบบนี้ (ฉันรู้ว่ามันใช้ไม่ได้)? [^] - / \ ^:]

3
พฤติกรรมแปลก ๆ ของ“ ls -a | grep ^ \.”
ฉันต้องการแสดงเนื้อหาของ pwd และแสดงเฉพาะไฟล์ที่ขึ้นต้นด้วย dot ฉันพยายามls -a | grep ^\.แต่ฉันไม่สามารถเข้าใจได้ว่าทำไมสัญญาณออกจึงมีไฟล์ที่ไม่ได้ขึ้นต้นด้วย dot ตัวอย่างเช่น: Pictures .pip .pki .profile projects Public ฉันรู้ว่าฉันสามารถบรรลุสิ่งที่ฉันต้องการด้วยls -ld .*ฉันแค่อยากรู้เกี่ยวกับพฤติกรรมของ grep ซึ่งฉันไม่สามารถอธิบายได้


2
ใน VIM ให้แทนที่พา ธ ด้วยสแลชโดยไม่ใช้ Escape slashes
ในกลุ่มฉันต้องการแทนที่เส้นทางที่ยาว/a/b/f/g/d/gกับอีกอัน/s/g/w/d/g/rในไฟล์ข้อความ ปกติฉันจะใช้\/แต่มีเครื่องหมายทับมากเกินไปที่นี่ มีวิธีที่ง่ายกว่านี้ไหม?

4
นิพจน์ทั่วไปที่ใช้ \\ vs using \
ทำไม grep e\\.g\\. <<< "this is an e.g. wow" และ grep e\.g\. <<< "this is an e.g. wow" ทำสิ่งเดียวกัน ถ้าฉันเพิ่มเครื่องหมายสแลชที่สามมันก็มีผลลัพธ์เหมือนกัน แต่เมื่อฉันเพิ่มเครื่องหมายสแลชที่สี่มันไม่ทำงานอีกต่อไป สิ่งนี้เกี่ยวข้องกับคำถามจากการสอบแบบเก่าสำหรับชั้นเรียน มันถามว่าคนที่มีแบ็กสแลชสองตัวอันหนึ่งจะทำงานเพื่อเอาท์พุทบรรทัดด้วย "เช่น" ฉันคิดว่ามันไม่ทำงาน แต่ฉันพยายามทำให้แน่ใจและมันก็ทำเช่นนั้น คำอธิบายคืออะไร

7
ฉันจะ "ผสาน" รูปแบบในบรรทัดเดียวได้อย่างไร
ฉันกำลังทำ grep และ sed และฉันได้รับไฟล์ 2 บรรทัดที่ฉันสนใจฉันจะรับบรรทัดเหล่านี้ในบรรทัดเดียวที่ลงท้ายด้วยอักขระบรรทัดใหม่ได้อย่างไร ตอนนี้ฉันได้รับ: pattern1 pattern2 ฉันอยากได้ pattern1 pattern2 \n

2
เหตุใดจึงไม่ใช้โหมดเสริม regex เป็นค่าเริ่มต้น
ฉันกำลังใช้ sed ฉันใช้ regex ที่ถูกต้องเท่าที่ฉันจะเห็น แต่ sed ไม่ได้ทำอะไร ปรากฎว่าฉันใช้\s+ซึ่ง sed ไม่สามารถเข้าใจและเมื่อฉันเปลี่ยนไป[ ]+ใช้งานได้ ดังนั้นเพื่อสรุปฉันสร้าง regex เพื่อให้ทำงานฉันต้องหลบหนีเกือบทุกอย่างและลบ\sช่องว่างออก ดูเหมือนว่ามีโหมดที่จะหลีกเลี่ยงสิ่งเหล่านี้ทั้งหมดซึ่งเป็น-rดังนั้นฉันต้องการถาม: เหตุใดจึงไม่-rเป็นโหมดเริ่มต้นสำหรับ sed ทำไมฉันต้องไปเจอปัญหามากมายเพื่อหลบหนีทุกอย่าง? manบอกว่ามีตัวเลือก--posixและ "POSIX.2 BREs ควรได้รับการสนับสนุน" สิ่งนี้อ้างถึงอะไร โหมด NFA / DFA

3
นิพจน์ทั่วไปสำหรับค้นหาอักขระสองตัวใน Bash
ฉันกำลังมองหานิพจน์ทั่วไปที่ค้นหาการเกิดขึ้นของอักขระสองตัวในข้อความรายชื่อและอื่น ๆ บนบรรทัดคำสั่ง (Bash) หลักคำถาม : มีวิธีง่ายๆในการมองหาลำดับเช่นaa, ll, tttttฯลฯ ที่หนึ่งกำหนดนิพจน์ปกติที่จะมองหาที่ปรากฏ n ของตัวละครเดียวกันด้วย? สิ่งที่ฉันกำลังมองหาคือการบรรลุเป้าหมายในระดับพื้นฐานมาก ๆ บนบรรทัดคำสั่ง ใน Linux Shell หลังจากงานวิจัยบางอย่างฉันมาถึงคำตอบต่อไปนี้ - และคำถามที่เกิดจากพวกเขาดังนั้นพวกเขาเพียงแค่ให้คำแนะนำแก่ฉันว่าคำตอบอาจอยู่ที่ใด แต่: ก) (e) grep และปัญหาแบ็กสแลช grep 'a\{2\}' มองหา aa egrep'a{2}' มองหา aa คำถาม: ความจำเป็นของการตั้ง backlashes นั้นผูกพันกับคำสั่งที่ฉันใช้หรือไม่? ถ้าเป็นเช่นนั้นทุกคนสามารถให้คำแนะนำฉันกับฉันได้อย่างไรเมื่อใช้ (e) grep ที่นี่? b) ฉันพบคำตอบนี้ที่นี่สำหรับคำถามของฉันแม้ว่าจะไม่ใช่สิ่งที่ฉันกำลังมองหา: grep -E '(.)\1' filenameมองหารายการที่มีลักษณะเดียวกันที่ปรากฏมากกว่าหนึ่งครั้ง แต่ไม่ได้ถามบ่อยแค่ไหน ใกล้กับสิ่งที่ฉันกำลังมองหา แต่ฉันยังต้องการตั้งค่าการทำซ้ำจำนวนมาก …

2
คำจำกัดความของการแสดงออกปกติคืออะไร?
ฉันเพิ่งได้เป็นข้อโต้แย้งที่เป็นมิตรกับGhotiเกี่ยวกับสิ่งที่ถือว่าเป็นนิพจน์ปกติในการแสดงความคิดเห็นเพื่อคำตอบของฉันนี้คำถาม ฉันอ้างว่าต่อไปนี้เป็นนิพจน์ทั่วไป: `[Rr]eading[Tt]est[Dd]ata` Ghoti ไม่เห็นด้วยอ้างว่าเป็นไฟล์ glob แทน globหน้าในการเรียกร้องที่วิกิพีเดีย (เหมืองเน้น): Globs ไม่รวมไวยากรณ์สำหรับดาว Kleene ซึ่งอนุญาตการทำซ้ำหลายส่วนในส่วนก่อนหน้าของนิพจน์ ดังนั้นพวกเขาจึงไม่ถือว่าเป็นสำนวนปกติซึ่งสามารถอธิบายชุดของภาษาปกติที่มีขนาดใหญ่กว่าตัวอักษรที่ จำกัด ใด ๆ อย่างไรก็ตามไม่มีการอ้างอิงสำหรับการอ้างสิทธิ์นี้ซึ่งระบุว่าเป็นเพียงความคิดเห็นของวิกิพีเดีย เดี่ยวยูนิกซ์®ข้อมูลจำเพาะ, รุ่นที่ 2กล่าวว่าพื้นฐานนิพจน์ปกติ (BRE) สามารถแม้แต่จะเป็นตัวเดียว: อักขระทั่วไปคือ BRE ที่ตรงกับตัวเอง: อักขระใด ๆ ในชุดอักขระที่สนับสนุนยกเว้นอักขระพิเศษ BRE ที่แสดงรายการในอักขระพิเศษ BRE ดังนั้นคำจำกัดความของการแสดงออกปกติในโลก * คืออะไรและคำจำกัดความที่ไม่รวมไฟล์ globs?

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