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

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

7
วิธีการรวมข้อความของบรรทัดที่เป็นตัวอักษรเข้ากับบรรทัดที่เป็นตัวเลขในเชลล์?
ฉันมีไฟล์ที่มีข้อความเช่นนี้: AAAA BBBB CCCC DDDD 1234 5678 9012 3456 EEEE 7890 ฯลฯ ... และฉันต้องการจับคู่ตัวอักษรกับบรรทัดตัวเลขเพื่อให้เป็นเช่นนี้: AAAA 1234 BBBB 5678 CCCC 9012 DDDD 3456 EEEE 7890 ไม่มีใครรู้วิธีง่ายๆในการบรรลุเป้าหมายนี้หรือไม่?


1
ทำไมคำสั่ง regex บางคำจึงมีคำว่า '\' ตรงข้ามกับอักขระต่าง ๆ ?
ยกตัวอย่างเช่นคำสั่งนี้: find . -regex ".*\.\(cpp\|h\)" นี่จะค้นหาไฟล์. h และ. cpp ทั้งหมดในไดเรกทอรีของคุณ อักขระระยะเวลา '.' ในการแสดงออกปกติมักจะหมายถึง "ตัวละครใด ๆ " เพื่อให้ตรงกับช่วงเวลาจริงคุณต้องหลบหนีโดยใช้เครื่องหมายแบ็กสแลช '\' ในกรณีนี้ให้ตัวละครที่มีความหมายพิเศษคุณต้องหลบหนีเพื่อให้ได้ตัวละครที่แท้จริงที่มันหมายถึง ตอนนี้ใช้วงเล็บและแถบ "หรือ" เป็นอักขระ '(', ')' และ '|' ตามลำดับ สิ่งเหล่านี้มีความหมายพิเศษซึ่งใช้สำหรับจัดกลุ่มนิพจน์ทั่วไป อย่างไรก็ตามเพื่อให้ได้ความหมายพิเศษตัวละครจะต้องถูกหลบหนีโดยใช้เครื่องหมายทับขวา! หากไม่มีเครื่องหมายแบ็กสแลชอักขระจะมีความหมายของอักขระจริงที่แสดงถึง ทำไม '.' ถือว่าแตกต่างจาก '(', ')' และ '|'?

5
ลบสตริงนำในทุบตี
ฉันมีสตริงเหมือนrev00000010และฉันต้องการเพียงหมายเลขสุดท้าย 10 ในกรณีนี้ ฉันได้ลองสิ่งนี้แล้ว: TEST='rev00000010' echo "$TEST" | sed '/^[[:alpha:]][0]*/d' echo "$TEST" | sed '/^rev[0]*/d' ทั้งสองส่งคืนอะไรแม้ว่า regex ดูเหมือนจะถูกต้อง (ลองกับregexr )

3
ใช้ regex ที่เข้ากันได้กับ Perl กับ GNU grep -P
ฉันใช้ regex นี้(?<=\[')[^,]*กับไฟล์ที่มีบรรทัดต่อไปนี้disk = ['OVS/sdasd/asdasd/asdasd/something.img, w'] ฉันต้องการที่จะกลับมา OVS/sdasd/asdasd/asdasd/something.img ฉันจะใช้grepเพื่อทำให้มันทำงานได้อย่างไร ฉันได้ลองแล้วgrep -P "(?<=\[')[^,]*"แต่มันกลับมาทั้งบรรทัด

1
หนีจุดเดียวด้วยแบ็กสแลชคู่ - awk
หนังสือ "การเขียนโปรแกรม awk ที่มีประสิทธิภาพ" มีตัวอย่างเกี่ยวกับการแยกฟิลด์ นี่คือตัวอย่าง: ‘FS = "\\.."’ถ้าคุณต้องการที่สาขาที่จะแยกจากกันโดยระยะเวลาที่แท้จริงตามด้วยอักขระตัวเดียวใช้ เหตุใดจึงเป็นแบ็กสแลชสองครั้ง มันไม่ควรจะเป็น\..?


2
ทำไม '[az] *' ตรงกับสตริงที่ไม่ใช่ตัวอักษร?
ฉันมีไฟล์ที่alphanumมีสองบรรทัดเหล่านี้: 123 abc this is a line ฉันสับสนว่าทำไมเมื่อฉันรันsed 's/[a-z]*/SUB/' alphanumฉันจะได้ผลลัพธ์ต่อไปนี้: SUB123 abc SUB is a line ผมคาดหวังว่า: 123 SUB SUB is a line ฉันพบวิธีแก้ไข (ใช้sed 's/[a-z][a-z]*/SUB/'แทน) แต่ฉันไม่เข้าใจว่าทำไมมันถึงใช้งานได้และของฉันก็ใช้ไม่ได้ คุณช่วยได้ไหม

3
ทำไมหรือทำไมจึงใช้ `. *?` ดีกว่า '. *'?
ฉันตอบคำถามนี้ใน SuperUserซึ่งเป็นสิ่งที่เกี่ยวข้องกับประเภทของนิพจน์ทั่วไปที่ใช้ในขณะที่ทำการพิมพ์ออกมา คำตอบที่ฉันให้คือ: tail -f log | grep "some_string.*some_string" จากนั้นในสามความคิดเห็นต่อคำตอบของฉัน@Bobเขียนสิ่งนี้: .*เป็นโลภและอาจจับภาพมากกว่าที่คุณต้องการ .*?มักจะดีกว่า ถ้าอย่างนั้น the ?เป็นตัวดัดแปลง*ทำให้มันขี้เกียจแทนที่จะเป็นค่าเริ่มต้นโลภ สมมติว่า PCRE ฉันไปหาPCREแต่ไม่สามารถเข้าใจความหมายของคำตอบนี้ได้? และในที่สุดนี้ ฉันควรชี้ให้เห็นว่านี่คือ regex (grep ทำ POSIX regex โดยปริยาย) ไม่ใช่ shell glob ฉันรู้ว่า Regex คืออะไรและใช้งานพื้นฐานมากเพียงใดในคำสั่ง grep ดังนั้นฉันไม่สามารถรับความคิดเห็นทั้งสามข้อเหล่านี้ได้และฉันมีคำถามเหล่านี้อยู่ในใจ: อะไรคือความแตกต่างในการใช้งานของ.*?vs. .*? ไหนดีกว่าและภายใต้สถานการณ์ใด กรุณาให้ตัวอย่าง นอกจากนี้ยังจะเป็นประโยชน์ในการทำความเข้าใจความคิดเห็นถ้าใครทำได้ UPDATE: เพื่อเป็นคำตอบสำหรับคำถามRegex ต่างจาก Shell Globs อย่างไร @Kusalanandaระบุลิงก์นี้ในความคิดเห็นของเขา หมายเหตุ: หากจำเป็นโปรดอ่านคำตอบของฉันสำหรับคำถามนี้ก่อนตอบเพื่ออ้างอิงถึงบริบท

2
Grep เริ่มต้นจากข้อความคงที่จนกระทั่งบรรทัดว่างแรก
ฉันมีไฟล์prova.txtเช่นนี้: Start to grab from here: 1 fix1 fix2 fix3 fix4 random1 random2 random3 random4 extra1 extra2 bla Start to grab from here: 2 fix1 fix2 fix3 fix4 random1546 random2561 extra2 bla bla Start to grab from here: 1 fix1 fix2 fix3 fix4 random1 random22131 และฉันต้อง grep out จาก "Start …


4
การจับคู่สตริงที่มีจำนวนอักขระคงที่โดยใช้ grep
ฉันพยายามค้นหา6คำศัพท์ที่ใช้grepทั้งหมด ฉันมีสิ่งนี้: grep "^.\{6\}$" myfile.txt étuisแต่ฉันพบว่านอกจากนี้ผมยังได้รับผลเช่น étude, ฉันสงสัยว่ามันมีบางอย่างเกี่ยวกับสัญลักษณ์ด้านบนeในคำด้านบน มีสิ่งที่ฉันสามารถทำได้เพื่อให้แน่ใจว่าสิ่งนี้จะไม่เกิดขึ้น? ขอบคุณสำหรับความช่วยเหลือของคุณ!

7
แทนที่อักขระยกเว้นการเกิด x ครั้งล่าสุด
ฉันมีไฟล์ที่มีชื่อโฮสต์มากมายสัมพันธ์กับ IP ที่มีลักษณะดังนี้: x-cluster-front-1 192.168.1.2 x-cluster-front-2 192.158.1.10 y-cluster-back-1 10.1.11.99 y-cluster-back-2 10.1.157.38 int.test.example.com 59.2.86.3 super.awesome.machine 123.234.15.6 ฉันอยากให้มันเป็นแบบนี้: x-cluster-front-1 192.168.1.2 x-cluster-front-2 192.158.1.10 y-cluster-back-1 10.1.11.99 y-cluster-back-2 10.1.157.38 int-test-example-com 59.2.86.3 super-awesome-machine 123.234.15.6 ฉันจะแทนที่ (จุด) จากคอลัมน์แรกด้วย - (เครื่องหมายขีดกลาง) เพื่ออำนวยความสะดวกในการจัดเรียงตามคอลัมน์ที่สอง? ฉันกำลังคิดที่จะใช้ sed เพื่อแทนที่จุดจนถึงช่องว่างแรกหรือแทนที่จุดทุกจุดยกเว้นสามจุดสุดท้าย แต่ฉันมีปัญหาในการเข้าใจ regex และ sed ฉันสามารถทำการทดแทนแบบง่าย ๆ แต่นี่เป็นวิธีเหนือหัวของฉัน! นี่เป็นส่วนหนึ่งของสคริปต์ที่ใหญ่กว่าที่ฉันเขียนด้วยการทุบตี ฉันติดอยู่ที่ส่วนนี้

1
grep สำหรับคำไม่เกินความยาวที่แน่นอน
ฉันกำลังมองหาวิธีที่จะ grep สิ่งต่าง ๆ เช่น: i log for E M, i 1 f x i 0, I xi 1, 3 1,.เพียงแค่ขึ้นอยู่กับจำนวนของตัวละคร ไม่มีสิ่งใดในเอาต์พุตสมมุติฐานที่มีความยาวเกินสามอักขระ หนึ่งซับสมมุติฐานนี้จะมีลักษณะเหมือน, grep -v [:alnum:] > {3}. (ยกเว้นว่าฉันไม่รู้วิธีเขียนในไวยากรณ์ grep)

2
วิธีการเปลี่ยนสตริงทั้งหมดในไฟล์ python จาก snake_case เป็น camelCase ใน sed
ฉันลองรูปแบบที่น่าสนใจเช่นนี้จาก commandlinefu sed -r "s/('[a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/" แต่อย่างใดมันไม่ทำงาน มีอยู่สิ่งหนึ่งที่พวกเขาลืมตัวเลขซึ่งฉันสามารถแก้ไขได้ แต่รูปแบบนี้ใช้ได้กับขีดเส้นใต้เดียวเท่านั้น ตัวอย่างเช่นถ้าฉันมีสตริงในไฟล์ 'foo_bar_foo' มันจะแปลงเป็น 'fooBar_foo' . ซึ่งไม่ใช่สิ่งที่ฉันต้องการ (ฉันต้องการ'fooBarFoo') ฉันต้องการเปลี่ยนสตริงในไฟล์ไม่ใช่ชื่อตัวแปรหรืออย่างอื่น ตัวอย่างเช่นนี้ delta_limits=Limits(general_settings['signal_lower_limit'] ควรเป็นแบบนี้ delta_limits=Limits(general_settings['signalLowerLimit']
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.