คำถามติดแท็ก sed

sed เป็นตัวแก้ไขสตรีมบรรทัดคำสั่งสำหรับการกรองและแปลงข้อความ

7
วิธีการแยกไฟล์ข้อความขนาดใหญ่อย่างมีประสิทธิภาพโดยไม่ต้องแยกหลายระเบียน
ฉันมีไฟล์ข้อความขนาดใหญ่ (~ 50Gb เมื่อ gz'ed) ไฟล์มี4*Nเส้นหรือNบันทึก นั่นคือทุกระเบียนประกอบด้วย 4 บรรทัด ฉันต้องการแบ่งไฟล์นี้เป็นไฟล์ขนาดเล็กลง 4 ไฟล์แต่ละไฟล์มีขนาดประมาณ 25% ของไฟล์อินพุต ฉันจะแบ่งไฟล์ที่ขอบเขตการบันทึกได้อย่างไร? วิธีการที่ไร้เดียงสาจะเป็นzcat file | wc -lที่จะได้รับการนับเส้นแบ่งว่าจำนวน 4 split -l <number> fileและการใช้งานแล้ว อย่างไรก็ตามสิ่งนี้จะข้ามไฟล์สองครั้งและการนับบรรทัดช้ามาก (36 นาที) มีวิธีที่ดีกว่า? นี่เข้ามาใกล้ แต่ไม่ใช่สิ่งที่ฉันกำลังมองหา คำตอบที่ยอมรับจะนับจำนวนบรรทัดด้วย แก้ไข: ไฟล์มีข้อมูลลำดับในรูปแบบ fastq สองระเบียนมีลักษณะเช่นนี้ (ไม่ระบุชื่อ): @NxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxGCGA+ATAGAGAG xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxTTTATGTTTTTAATTAATTCTGTTTCCTCAGATTGATGATGAAGTTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + AAAAA#FFFFFFFFFFFFAFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF<AFFFFFFFFFFAFFFFFFFFFFFFFFFFFFF<FFFFFFFFFAFFFAFFAFFAFFFFFFFFAFFFFFFAAFFF<FAFAFFFFA @NxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxGCGA+ATAGAGAG xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxCCCTCTGCTGGAACTGACACGCAGACATTCAGCGGCTCCGCCGCCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + AAAAA#FFFFF7FFFFFFAFFFFA#F7FFFFFFFFF7FFFFFAF<FFFFFFFFFFFFFFAFFF.F.FFFFF.FAFFF.FFFFFFFFFFFFFF.)F.FFA))FFF7)F7F<.FFFF.FFF7FF<.FFA<7FA.<.7FF.FFFAFF @บรรทัดแรกของแต่ละระเบียนจะเริ่มต้นด้วย EDIT2: zcat file > …

4
เลือกแทนการค้นหาและแทนที่บรรทัดที่ยาวมาก
ฉันมีไฟล์ที่สร้างขึ้นโดยโปรแกรมที่ไม่ได้ขึ้นบรรทัดใหม่เมื่อสิ้นสุดการบันทึก ฉันต้องการขึ้นบรรทัดใหม่ระหว่างระเบียนและฉันสามารถทำได้ด้วยสคริปต์แบบง่าย: sed -e 's/}{/}\n{/g' ปัญหาคือไฟล์อินพุตมีขนาดหลายกิกะไบต์และดังนั้นบรรทัดอินพุตเป็น sed มีความยาวหลาย GB sed พยายามเก็บสายไว้ในหน่วยความจำซึ่งไม่สามารถใช้งานได้ในกรณีนี้ ฉันลองใช้--unbufferedตัวเลือก แต่ดูเหมือนว่าจะทำให้ช้าลงและไม่อนุญาตให้ทำอย่างถูกต้อง
9 sed 

2
sed: อ่านไฟล์ทั้งหมดในพื้นที่รูปแบบโดยไม่ล้มเหลวในอินพุตบรรทัดเดียว
การอ่านไฟล์ทั้งหมดในพื้นที่รูปแบบมีประโยชน์สำหรับการแทนที่บรรทัดใหม่ & c และมีหลายกรณีที่ให้คำแนะนำต่อไปนี้: sed ':a;N;$!ba; [commands...]' อย่างไรก็ตามมันจะล้มเหลวหากอินพุตมีเพียงหนึ่งบรรทัด ตัวอย่างเช่นด้วยอินพุตสองบรรทัดทุกบรรทัดจะต้องอยู่ภายใต้คำสั่งการแทนที่: $ echo $'abc\ncat' | sed ':a;N;$!ba; s/a/xxx/g' xxxbc cxxxt แต่ด้วยอินพุตบรรทัดเดียวจะไม่มีการทดแทน: $ echo 'abc' | sed ':a;N;$!ba; s/a/xxx/g' abc เราจะเขียนsedคำสั่งเพื่ออ่านอินพุตทั้งหมดในครั้งเดียวและไม่มีปัญหานี้ได้อย่างไร?
9 sed  newlines 

9
เราสามารถพิมพ์คำสุดท้ายของแต่ละบรรทัดใน linux โดยใช้คำสั่ง sed ได้หรือไม่?
สมมติว่าหากมีไฟล์ประกอบด้วยบรรทัดต่อไปนี้ถ้าเป็น 12345 567 7878 66 er3 t45t y6y46y 4y6 y656y y5y 46y6 65 ปี 7 y66uyuy yy46y6y ผลลัพธ์ต้องมีลักษณะดังนี้: 66 y6y46y y5y y66uyuyy y46y6y ฉันได้ลองใช้sed 's/.* //g'ชื่อไฟล์คำสั่งและsedคำสั่งอื่น ๆแล้ว แต่มันไม่ทำงาน ฉันจะรู้ได้อย่างไรว่าsedคำสั่งที่แน่นอนคืออะไร?

5
ค้นหาสตริงและพิมพ์ทุกอย่างก่อนและหลังภายในช่วง
ฉันมีไฟล์นี้: sometext1{ string1 } sometext2{ string2 string3 } sometext3{ string4 string5 string6 } ฉันต้องการที่จะค้นหาแฟ้มนี้เพื่อหาสตริงที่เฉพาะเจาะจงและพิมพ์ทุกอย่างก่อนที่สายนี้ขึ้นอยู่กับการเปิดและทุกอย่างหลังจากที่สายนี้ถึงปิด{ }ฉันพยายามที่จะบรรลุสิ่งนี้ด้วย sed แต่ถ้าฉันพยายามพิมพ์ทุกอย่างในช่วง/{/,/string2/ตัวอย่างเช่น sed พิมพ์สิ่งนี้: sometext1{ string1 } sometext2{ string2 sometext3{ string4 string5 string6 } ถ้าฉันค้นหาสตริง "string2" ฉันต้องการผลลัพธ์เป็น: sometext2{ string2 string3 } ขอบคุณ

8
จะผนวก Line เข้ากับ Line ก่อนหน้าได้อย่างไร?
ฉันมีไฟล์บันทึกซึ่งต้องวิเคราะห์และวิเคราะห์ ไฟล์มีบางสิ่งที่คล้ายกันดังนี้: ไฟล์: 20141101 server contain dump 20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdl sddsfd jfkdfk 20141101 server contain dump จากสถานการณ์ข้างต้นฉันต้องตรวจสอบว่าบรรทัดเริ่มต้นไม่มีวันที่หรือหมายเลขที่ฉันต้องต่อท้ายบรรทัดก่อนหน้า ไฟล์ที่ส่งออก: 20141101 server contain dump 20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdl sddsfd jfkdfk 20141101 server contain dump

1
ฉันจะพิมพ์ทั้งหมดยกเว้นบรรทัดที่ N ถึงบรรทัดสุดท้ายได้อย่างไร?
ฉันต้องการทำส่วนประกอบ / "ตรงกันข้าม" ของ sed 13q;d <file.txt โดยทั่วไปแล้วเป็นไปได้ไหมที่เราจะทำส่วนเติมเต็ม / ผกผัน / ตรงกันข้ามในนี้sedหรือไม่? หรือเฉพาะสำหรับ regexes ฉันจะพิมพ์ทั้งหมดยกเว้นบรรทัดที่สามถึงครั้งสุดท้ายได้อย่างไร สิ่งนี้ต้องใช้สองtacและนับไปข้างหน้าsedหรือไม่? หรือมีวิธีที่จะทำให้sedตัวเองนับจากด้านหลัง?

2
ลบอักขระยูนิโค้ดที่ไม่รู้จักออกจาก textfiles - sed วิธีทุบตี / bash อื่น ๆ
ฉันต้องการค้นหาและแทนที่อักขระที่ไม่รู้จักทั้งหมดในบางไฟล์ที่มีชื่อเหมือนกัน เมื่อเปิดไฟล์ดังกล่าวด้วย vi ฉันอ่านรหัส <91> สำหรับตัวละครนั้น เมื่อเปิดมันด้วยนาโนฉันอ่าน "เครื่องหมายคำถาม" ในรูปเพชร (สีดำสลัว) ฉันต้องการแทนที่ตัวละครที่ไม่รู้จักด้วยเครื่องหมายคำพูด (') ฉันพยายามหลายวิธีโดยไม่มีโชค ฉันเหนื่อย: find ./ -name filename.txt -exec perl -i~ -pe "s/\x91/'/" {} \; find ./ -name filename.txt -exec sed -i "s/\x91/'/g" {} \; แก้ไข ข้อมูลเพิ่มเติมเกี่ยวกับตัวละคร: Hexadecimal: 91 68 74 74 Decimal: 145 104 116 116 Octal: 221 150 …

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
มีตัวเลือกในการทำให้ sed ล้มเหลวหรือไม่หากไม่พบรูปแบบ
ฉันต้องการค้นหาและแทนที่รูปแบบบางอย่างในไฟล์บางไฟล์ แต่ฉันต้องการให้ส่งคืน 1 หรือบางอย่างหากไม่พบรูปแบบ ฉันสามารถทำสิ่งนี้ด้วยการอยู่คนเดียวหรือฉันต้องตรวจสอบว่ามีรูปแบบอยู่กับคำสั่งอื่นหรือไม่? ข้อเสนอแนะใด ๆ
9 sed 

1
แทนที่หลายบรรทัดใน sed หรือ awk [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันกำลังพยายามใช้ sed หรือ awk เพื่อแทนที่ 5 บรรทัดในไฟล์ smb แต่ฉันไม่มีความคิดวิธีจัดการกับการขึ้นบรรทัดใหม่
9 sed  awk  scripting  perl 

6
หยิบเนื้อหาบางอย่างของไฟล์
ดังนั้นฉันรู้ว่าเครื่องมือมีอยู่สำหรับปัญหานี้เพราะฉันเคยได้ยินเกี่ยวกับพวกเขา แต่ฉันไม่รู้ว่าพวกเขาคืออะไร ฉันต้องการทำอะไรบางอย่างเช่นกรองข้อมูลทั้งหมดยกเว้นชื่อผู้ใช้ใน / etc / passwd ตัวอย่างเช่นฉันต้องการคว้า user1, user2 และ user3 จากไฟล์ต่อไปนี้ ในกรณีนี้ตรรกะอาจเป็น "หยิบข้อความถึง ':' แรกในแต่ละบรรทัดของไฟล์" user1:x:1:4 user2:x:2:5 user3:x:3:6 ผลลัพธ์จะเป็น: user1 user2 user3
9 files  sed  awk  cut 

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']

2
คำสั่ง sed พร้อมตัวเลือก -n และ '$ ='
ฉันต้องการพิมพ์จำนวนบรรทัดในไฟล์โดยใช้sedคำสั่ง ฉันมีบรรทัดต่อไปนี้สำหรับสิ่งนั้นโปรดมีใครอธิบายรายละเอียดได้บ้าง sed -n '$=' myfile.txt
3 sed 

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