คำตอบที่รวดเร็ว
sed ':a;N;$!ba;s/\n/ /g' file
- : a สร้างป้ายกำกับ 'a'
- ยังไม่มีการ ผนวกบรรทัดถัดไปกับพื้นที่รูปแบบ
- $! ถ้าไม่ใช่บรรทัดสุดท้าย , ba สาขา (ไปที่) ป้ายกำกับ 'a'
- s แทน , / \ n / regex สำหรับสายใหม่ , / / ด้วยช่องว่าง , / g การแข่งขันทั่วโลก (หลายครั้งตามที่มันสามารถ)
sed จะวนซ้ำไปตามขั้นตอนที่ 1 ถึง 3 จนกว่าจะถึงบรรทัดสุดท้ายรับทุกบรรทัดพอดีในพื้นที่รูปแบบที่ sed จะแทนที่อักขระทั้งหมด \ n
ทางเลือก
ทางเลือกทั้งหมดต่างจากsedไม่จำเป็นต้องไปถึงบรรทัดสุดท้ายเพื่อเริ่มต้นกระบวนการ
ด้วยทุบตีช้า
while read line; do printf "%s" "$line "; done < file
ด้วยperl , ความเร็วเหมือนsed
perl -p -e 's/\n/ /' file
ด้วยtr , เร็วกว่าsed , สามารถแทนที่ด้วยอักขระหนึ่งตัวเท่านั้น
tr '\n' ' ' < file
มีวาง , TRเหมือนความเร็วสามารถแทนที่โดยตัวละครตัวหนึ่งเท่านั้น
paste -s -d ' ' file
ด้วยawk , ความเร็วเหมือนTR
awk 1 ORS=' ' file
ทางเลือกอื่น ๆ เช่น"echo $ (<file)"นั้นช้าใช้งานได้กับไฟล์ขนาดเล็กเท่านั้นและจำเป็นต้องประมวลผลไฟล์ทั้งหมดเพื่อเริ่มต้นกระบวนการ
5.10 เหตุใดฉันจึงไม่สามารถจับคู่หรือลบบรรทัดใหม่โดยใช้
ลำดับ\ n ยกเว้น เหตุใดฉันจึงไม่สามารถจับคู่ 2 บรรทัดขึ้นไปโดยใช้ \ n ได้
\ n จะไม่ตรงกับบรรทัดใหม่ที่ท้ายบรรทัดเนื่องจากการขึ้น
บรรทัดใหม่จะถูกตัดออกเสมอก่อนที่จะวางบรรทัดลงใน
พื้นที่รูปแบบ ในการรับ 2 บรรทัดขึ้นไปในพื้นที่รูปแบบให้ใช้
คำสั่ง 'N' หรือสิ่งที่คล้ายกัน (เช่น 'H; ... ; g;')
Sed ทำงานเช่นนี้: Sed อ่านครั้งละหนึ่งบรรทัดตัดการขึ้น
บรรทัดใหม่วางสิ่งที่เหลือไว้ในพื้นที่รูปแบบที่
สคริปต์ sed สามารถแก้ไขหรือเปลี่ยนแปลงและเมื่อพื้นที่รูปแบบ
ถูกพิมพ์ผนวกบรรทัดใหม่เพื่อ stdout (หรือไฟล์) หาก
พื้นที่รูปแบบถูกลบทั้งหมดหรือบางส่วนด้วย 'd' หรือ 'D'
บรรทัดใหม่จะไม่ถูกเพิ่มในกรณีดังกล่าว ดังนั้นสคริปต์เช่น
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
จะไม่ทำงานเนื่องจากการขึ้นบรรทัดใหม่ต่อท้ายจะถูกลบออกก่อน
ที่บรรทัดจะใส่ในพื้นที่รูปแบบ หากต้องการทำงานด้านบนให้
ใช้หนึ่งในสคริปต์เหล่านี้แทน:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
เนื่องจากรุ่นของ sed นอกเหนือจาก GNU sed มีข้อ จำกัด เกี่ยวกับขนาดของ
บัฟเฟอร์รูปแบบยูทิลิตี้ Unix 'tr' จึงเป็นที่ต้องการที่นี่
หากบรรทัดสุดท้ายของไฟล์มีการขึ้นบรรทัดใหม่ GNU จะเพิ่ม
บรรทัดใหม่นั้นลงในเอาต์พุต แต่จะ
ลบบรรทัดอื่นทั้งหมดในขณะที่ tr จะลบบรรทัดใหม่ทั้งหมด
เพื่อให้ตรงกับบล็อกของสองบรรทัดขึ้นไปมี 3 ตัวเลือกพื้นฐาน:
(1) ใช้คำสั่ง 'N' เพื่อเพิ่มบรรทัดถัดไปในพื้นที่รูปแบบ;
(2) ใช้คำสั่ง 'H' อย่างน้อยสองครั้งเพื่อต่อท้ายบรรทัดปัจจุบัน
ไปยังพื้นที่พักสายแล้วดึงสายจากพื้นที่พัก
ด้วย x, g หรือ G หรือ (3) ใช้ช่วงที่อยู่ (ดูหัวข้อ 3.3 ด้านบน)
เพื่อจับคู่บรรทัดระหว่างที่อยู่ที่ระบุสองแห่ง
ตัวเลือก (1) และ (2) จะใส่ \ n ลงในช่องว่างรูปแบบซึ่ง
สามารถแก้ไขได้ตามต้องการ ('s / ABC \ nXYZ / ตัวอักษร / g') ตัวอย่างหนึ่ง
ของการใช้ 'N' ลบบล็อกของสายปรากฏในส่วน 4.13
( "ฉันจะลบบล็อกของวิธีเฉพาะสายติดต่อกัน?")
ตัวอย่างนี้สามารถแก้ไขได้โดยการเปลี่ยนคำสั่งลบเป็นอย่าง
อื่นเช่น 'p' (พิมพ์), 'i' (แทรก), 'c' (เปลี่ยน), 'a' (ผนวก)
หรือ 's' (ทดแทน) .
Choice (3) จะไม่ใส่ \ n เข้าไปในพื้นที่รูปแบบ แต่มันไม่
ตรงกับบล็อกของสายติดต่อกันดังนั้นจึงอาจเป็นไปได้ว่าคุณไม่
จำเป็นต้อง \ n เพื่อค้นหาสิ่งที่คุณกำลังมองหา ตั้งแต่ GNU sed
เวอร์ชัน 3.02.80 ตอนนี้รองรับไวยากรณ์นี้:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
นอกจากที่อยู่แบบดั้งเดิม '/ จากที่นี่ /, / ถึงที่นั่น / {... }'
อาจเป็นไปได้ที่จะหลีกเลี่ยงการใช้ \ n โดยสิ้นเชิง
tr
เป็นเครื่องมือที่เหมาะสมสำหรับงานหากแทนที่อักขระเดียวสำหรับอักขระเดียวในขณะที่ตัวอย่างด้านบนแสดงแทนที่ newline ด้วยช่องว่าง .. ในตัวอย่างข้างต้น tr สามารถใช้งานได้ แต่จะ จำกัด ในภายหลัง