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

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

2
ฉันจะพิมพ์ค่า ASCII (ตัวเลข) ของอักขระแต่ละตัวในไฟล์ได้อย่างไร
ฉันจะพิมพ์ค่า ASCII ตัวเลขของอักขระแต่ละตัวในไฟล์ข้อความได้อย่างไร กดcatไลค์ แต่แสดงค่า ASCII เท่านั้น ... (ฐานสิบหกหรือทศนิยมเป็นปกติ) ตัวอย่างเอาต์พุตสำหรับไฟล์ที่มีคำว่าApple (ที่มีการป้อนบรรทัด) อาจมีลักษณะดังนี้: 065 112 112 108 101 013 004
11 linux  bash  sed  awk  terminal 

8
ลบบรรทัดแบบแทนที่ในระบบไฟล์แบบเต็ม?
เนื่องจากข้อผิดพลาดของแอปพลิเคชั่นที่ยังไม่ได้ถูกเปิดเผยฉันมีเซิร์ฟเวอร์หลายร้อยเครื่องพร้อมดิสก์เต็มรูปแบบ มีไฟล์หนึ่งไฟล์ที่เต็มไปด้วยบรรทัดที่ซ้ำกันไม่ใช่ไฟล์บันทึก แต่เป็นไฟล์สภาพแวดล้อมผู้ใช้ที่มีคำจำกัดความของตัวแปร (ดังนั้นฉันจึงไม่สามารถลบไฟล์ได้) ฉันเขียนsedคำสั่งง่ายๆเพื่อตรวจสอบหาบรรทัดที่เพิ่มผิดและลบออกแล้วทดสอบในสำเนาของไฟล์ มันทำงานได้ตามที่ตั้งใจไว้ อย่างไรก็ตามเมื่อฉันลองบนเซิร์ฟเวอร์ด้วยดิสก์เต็มฉันได้รับข้อผิดพลาดดังต่อไปนี้ (มาจากหน่วยความจำไม่ใช่คัดลอกและวาง): sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname แน่นอนฉันรู้ว่าไม่มีพื้นที่เหลือ นั่นเป็นเหตุผลที่ฉันพยายามลบเนื้อหา! ( sedคำสั่งที่ฉันใช้จะลดไฟล์บรรทัด 4000+ เป็นประมาณ 90 บรรทัด) sedคำสั่งของฉันเป็นเพียงsed -i '/myregex/d' /path/to/file/filename มีวิธีที่ฉันสามารถใช้คำสั่งนี้แม้จะมีดิสก์เต็มหรือไม่? (ต้องเป็นแบบอัตโนมัติเนื่องจากฉันต้องใช้กับเซิร์ฟเวอร์หลายร้อยเครื่องเพื่อแก้ไขปัญหาอย่างรวดเร็ว) (เห็นได้ชัดว่าข้อผิดพลาดของแอปพลิเคชันจะต้องได้รับการวินิจฉัย แต่ในขณะเดียวกันเซิร์ฟเวอร์ก็ทำงานไม่ถูกต้อง .... ) อัปเดต:สถานการณ์ที่ฉันเผชิญได้รับการแก้ไขโดยการลบสิ่งอื่นที่ฉันพบว่าฉันสามารถลบได้ แต่ฉันยังต้องการคำตอบสำหรับคำถามนี้ซึ่งจะเป็นประโยชน์ในอนาคตและสำหรับคนอื่น ๆ /tmpคือไม่ต้องไป มันอยู่ในระบบไฟล์เดียวกัน ก่อนที่ผมจะอิสระขึ้นพื้นที่ดิสก์ที่ผมได้ทดสอบและพบว่าฉันสามารถลบบรรทัดในviโดยการเปิดไฟล์และทำงานแล้วประสบความสำเร็จในการบันทึกการเปลี่ยนแปลงด้วย:g/myregex/d :wqดูเหมือนว่าเป็นไปได้ที่จะทำสิ่งนี้โดยอัตโนมัติโดยไม่ต้องใช้ระบบไฟล์แยกต่างหากเพื่อเก็บไฟล์ temp .... (?)

6
ลบบรรทัดออกจากไฟล์โดยขึ้นอยู่กับบรรทัดที่พบในไฟล์อื่น
ไฟล์ file1.txt มีบรรทัดเช่น: /api/purchase/<hash>/index.html ตัวอย่างเช่น: /api/purchase/12ab09f46/index.html ไฟล์ file2.csv มีบรรทัดเช่น: <hash>,timestamp,ip_address ตัวอย่างเช่น: 12ab09f46,20150812235200,22.231.113.64 a77b3ff22,20150812235959,194.66.82.11 ฉันต้องการกรอง file2.csv ลบบรรทัดทั้งหมดที่มีค่าแฮชอยู่ใน file1.txt กล่าวได้ว่า: cat file1.txt | extract <hash> | sed '/<hash>/d' file2.csv หรืออะไรทำนองนี้ มันควรจะตรงไปตรงมา แต่ดูเหมือนว่าฉันจะไม่สามารถใช้งานได้ ใครช่วยกรุณาให้ขั้นตอนการทำงานสำหรับงานนี้ได้ไหม

2
ไม่ต้องลบรูปแบบเริ่มต้นทั้งหมดที่ตรงกันจากบรรทัด
ฉันมีบรรทัดต่อไปนี้: abababtestab ฉันพยายามหาsedนิพจน์เพื่อลบการเกิดขึ้นทั้งหมดabจากจุดเริ่มต้นของบรรทัดดังนั้นบรรทัดที่แปลงควรเป็น: testab ฉันรู้สึกเช่นนี้ควรจะง่าย sedแต่ผมไม่ทราบอะไรเกี่ยวกับ สิ่งที่ฉันมีอยู่คือ: sed 's/^ab//' แต่สิ่งนี้จะลบเฉพาะการเกิดขึ้นครั้งแรกของ ab
11 sed 

2
ทำดัชนีไฟล์ CSV ใหม่อีกครั้ง
ฉันได้คำตอบในหัวข้อที่เป็นประโยชน์นี้แต่ปัญหาของฉันดูเหมือนจะแตกต่างกันพอที่ฉันไม่สามารถคิดถึงคำตอบที่ดี (อย่างน้อยก็ด้วยsed) ฉันมีไฟล์ CSV ขนาดใหญ่ (200+ GB) พร้อมแถวที่มีลักษณะดังนี้: <alphanumerical_identifier>,<number> ที่<alphanumerical_identifier>ไม่ซ้ำกันในไฟล์ทั้งหมด ฉันต้องการสร้างไฟล์แยกที่แทนที่คอลัมน์แรกด้วยดัชนีเช่น <index>,<number> เพื่อให้เราได้รับ: 1, <number> 2, <number> 3, <number> สามารถawkสร้างดัชนีที่เพิ่มขึ้นโดยไม่โหลดไฟล์เต็มในหน่วยความจำได้ไหม? เนื่องจากดัชนีเพิ่มขึ้นแบบ monotonically มันอาจจะดีกว่าถ้าจะวางดัชนี วิธีแก้ปัญหาสำหรับสิ่งนั้นจะแตกต่างกันหรือไม่เช่น: <number> <number> <number>
11 files  sed  awk  csv 

2
เร็วที่สุด & วิธีที่สำคัญที่สุดในการแทนที่“ \ r \ n” ด้วย“ \ n” ในไฟล์?
ฉันคิดว่าtrเป็นวิธีหลักมากกว่าและอาจเป็นวิธีที่เร็วกว่าในการแทนที่สิ่งต่าง ๆ ในไฟล์ที่กำหนด อย่างไรก็ตาม tr สามารถแทนที่อักขระในจำนวนเท่ากันเท่านั้น ความหมาย ... 2 ตัวอักษรสามารถถูกแทนที่ด้วย 2 ตัวอักษรซึ่งหมายถึงการแทนที่ \r\nด้วยไม่\nอยู่คำถามtr ตัวเลือกที่ดีที่สุดต่อไปsedคืออะไร? เป็นวิธีที่สำคัญที่สุดและเร็วที่สุดในการแทนที่\r\nด้วย\nไฟล์เนื่องจากขาดความสามารถใน TR ต้องการตัวอย่างถ้าเป็นไปได้
11 sed  replace  tr 

3
แทนที่สตริงจำนวนมากในการส่งผ่านครั้งเดียว
ฉันกำลังมองหาวิธีที่จะแทนที่สตริงตัวยึดตำแหน่งในไฟล์แม่แบบด้วยค่าที่เป็นรูปธรรมด้วยเครื่องมือ Unix ทั่วไป (ทุบตี, sed, awk, อาจ perl) เป็นสิ่งสำคัญที่การเปลี่ยนจะดำเนินการในรอบเดียวนั่นคือสิ่งที่สแกน / เปลี่ยนแล้วจะต้องไม่ถูกนำมาพิจารณาสำหรับการเปลี่ยนใหม่ ตัวอย่างเช่นความพยายามสองครั้งนี้ล้มเหลว: echo "AB" | awk '{gsub("A","B");gsub("B","A");print}' >> AA echo "AB" | sed 's/A/B/g;s/B/A/g' >> AA ผลลัพธ์ที่ถูกต้องในกรณีนี้คือหลักสูตร BA โดยทั่วไปการแก้ปัญหาควรเทียบเท่ากับการสแกนอินพุตจากซ้ายไปขวาสำหรับการจับคู่ที่ยาวที่สุดไปยังสตริงการแทนที่ที่กำหนดอย่างใดอย่างหนึ่งและสำหรับการแข่งขันแต่ละครั้งทำการแทนที่และดำเนินการต่อจากจุดนั้นบนอินพุต (ไม่มี อ่านอินพุตแล้วหรือการแทนที่ที่ดำเนินการควรพิจารณาให้ตรงกัน) ที่จริงแล้วรายละเอียดไม่สำคัญเพียงแค่ว่าผลของการเปลี่ยนจะไม่ถูกนำมาพิจารณาสำหรับการทดแทนอื่นทั้งหมดหรือบางส่วน หมายเหตุฉันกำลังมองหาโซลูชันทั่วไปที่ถูกต้องเท่านั้น โปรดอย่าเสนอวิธีแก้ปัญหาที่ล้มเหลวสำหรับอินพุตบางอย่าง (ไฟล์อินพุต, ค้นหาและแทนที่คู่) แต่ไม่น่าจะเป็นไปได้
11 bash  sed  awk  string  replace 

9
ฉันจะพิมพ์หมายเลขที่ยาวที่สุดในสตริงได้อย่างไร
ฉันกำลังมองหาวิธีการพิมพ์จำนวนที่ยาวที่สุดในสตริง เช่น: ถ้าฉันมีสตริง 212334123434test233 ฉันจะพิมพ์ได้อย่างไร 212334123434 ? หมายเหตุ: ฉันกำลังมองหาลำดับที่ต่อเนื่องยาวนานที่สุดของตัวเลขไม่ใช่ค่าที่สูงกว่าเป็นตัวเลข แก้ไข:ขอบคุณสำหรับคำตอบทุกคน การตอบคำถามนี้ค่อนข้างท่วมท้น ฉันทำเครื่องหมายโพสต์ของ @ HaukeLaging เป็นคำตอบที่ยอมรับได้เพราะมันเหมาะกับกรณีของฉันเป็นอย่างดี แต่ฉันต้องการชี้ให้เห็นว่าคำตอบทั้งหมดนั้นใช้ได้อย่างเท่าเทียมกัน เป็นเรื่องที่ดีเสมอที่จะมีตัวเลือกต่าง ๆ เพื่อแก้ไขปัญหา

6
สคริปต์เพื่อแยกรายการที่เลือกจากไฟล์ bibtex
ฉันมีไฟล์ bibtex ขนาดใหญ่ที่มีหลายรายการที่แต่ละรายการมีโครงสร้างทั่วไป @ARTICLE{AuthorYear, item = {...}, item = {...}, item = {...}, etc } (ในบางกรณีARTICLEอาจเป็นคำอื่นเช่นBOOK) สิ่งที่ฉันต้องการจะทำคือเขียนสคริปต์ง่ายๆ (โดยเฉพาะอย่างยิ่งสคริปต์ shell) เพื่อแยกรายการที่มี AuthorYear ที่กำหนดและใส่ลงในไฟล์. ibib ใหม่ ฉันสามารถจินตนาการได้ว่าฉันสามารถจำประโยคแรกของรายการโดย AuthorYear และประโยคสุดท้ายด้วยการปิดครั้งเดียว}และอาจใช้sedเพื่อแยกรายการ แต่ฉันไม่รู้วิธีการทำสิ่งนี้อย่างแท้จริง มีคนบอกฉันได้ไหมว่าฉันจะทำสิ่งนี้ได้อย่างไร มันน่าจะเป็นอะไรซักอย่าง sed -n "/AuthorYear/,/\}/p" file.bib แต่นั่นจะหยุดเนื่องจากการปิด}ในรายการแรกของรายการจึงให้ผลลัพธ์นี้: @ARTICLE{AuthorYear, item = {...}, ดังนั้นฉันจึงจำเป็นต้องรู้ว่า}ตัวละครตัวนี้เป็นตัวเดียวในบรรทัดหรือไม่และมีเพียง 'sed' ที่จะหยุดอ่านเมื่อเป็นกรณีนี้

12
เป็นวิธีที่ดีในการกรองไฟล์ข้อความเพื่อลบบรรทัดว่างอะไร
ฉันมีไฟล์. csv (สำหรับ mac) ที่มีบรรทัดว่างมากมายเช่น: "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4" "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum …

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หน้า


3
ค้นหาตำแหน่งแล้วทำการเปลี่ยนแปลงโดยใช้ sed
สคริปต์นี้ใช้ sed เพื่อเปลี่ยน "" ทั้งหมดเป็น "สิ่งใหม่" หนึ่งจะเปลี่ยนเพียงแค่ "" หลังจาก yyy: ใช้ sed หรือสิ่งอื่นได้อย่างไร cat >sample.txt <<EOF xxx: "" yyy: "" } EOF sed --expression='s/""/"new stuff"/' sample.txt
11 sed 

5
ลบบรรทัดที่ซ้ำกันที่อยู่ติดกันในขณะที่รักษาการสั่งซื้อ
ฉันมีไฟล์ที่มีหนึ่งคอลัมน์ที่มีชื่อที่ซ้ำหลายครั้งในแต่ละครั้ง ฉันต้องการรวมการทำซ้ำแต่ละครั้งเป็นหนึ่งในขณะที่การทำซ้ำชื่ออื่นที่มีชื่อเดียวกันที่ไม่ติดกับชื่อซ้ำกันอื่น ๆ เช่นฉันต้องการเลี้ยวซ้ายไปทางขวา: Golgb1 Golgb1 Golgb1 Akna Golgb1 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna Akna Spata20 Spata20 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna นี่คือสิ่งที่ฉันใช้: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt อย่างไรก็ตามวิธีนี้จะช่วยให้ตัวแทนหนึ่งคนจากด้านซ้ายเท่านั้น (เช่น Golb1 และ Akna ไม่ซ้ำกัน) มีวิธีในการเก็บชื่อที่ไม่ซ้ำกันสำหรับแต่ละบล็อกในขณะที่รักษาชื่อที่ทำซ้ำในบล็อกหลายบล็อกที่ไม่ติดกันหรือไม่
11 awk  sed  sort  uniq 


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