ฉันจะลบบรรทัดใหม่ออกจากไฟล์ข้อความได้อย่างไร


116

ฉันมีข้อมูลต่อไปนี้และจำเป็นต้องรวมข้อมูลทั้งหมดไว้ในบรรทัดเดียว

ฉันมีสิ่งนี้:

22791

;

14336

;

22821

;

34653

;

21491

;

25522

;

33238

;

ฉันต้องการนี้:

22791;14336;22821;34653;21491;25522;33238;

แก้ไข

ไม่มีคำสั่งใดทำงานได้อย่างสมบูรณ์

ส่วนใหญ่ให้ข้อมูลมีลักษณะดังนี้

22791

;14336

;22821

;34653

;21491

;25522

15
คัดลอกวางลงในแถบที่อยู่ของเบราว์เซอร์หรือช่องข้อความอื่น Quick'n'dirty แต่ใช้ได้กับข้อมูลจำนวนน้อย
ignis

คำตอบ:


245
tr -d '\n' < yourfile.txt

แก้ไข:

หากไม่มีคำสั่งใดที่โพสต์ที่นี่ใช้งานได้แสดงว่าคุณมีคำสั่งอื่นนอกเหนือจากการขึ้นบรรทัดใหม่เพื่อแยกฟิลด์ อาจเป็นไปได้ว่าคุณมีการสิ้นสุดบรรทัด DOS / Windows ในไฟล์ (แม้ว่าฉันจะคาดหวังว่าโซลูชัน Perl จะทำงานได้ในกรณีนั้น)

ลอง:

tr -d "\n\r" < yourfile.txt

หากไม่ได้ผลคุณจะต้องตรวจสอบไฟล์ของคุณอย่างละเอียดยิ่งขึ้น (เช่นในตัวแก้ไขฐานสิบหก) เพื่อค้นหาว่ามีอักขระใดบ้างที่คุณต้องการลบออก


7
คุณเขียนผลลัพธ์นี้ไปยังไฟล์เดียวกันหรือไฟล์อื่นได้อย่างไร?
StackOverflowOfficial

3
ผมว่าtrไม่เหมาะกับสายเปล่า คุณคิดอย่างไร? - - ฉันคิดว่าsedเป็นตัวเลือกที่ดีที่สุดตามที่อธิบายไว้ที่นี่stackoverflow.com/q/16414410/54964
LéoLéopold Hertz 준영

ในการกำหนดเส้นทางเอาต์พุตไปยังไฟล์อื่นให้ใช้การเปลี่ยนทิศทางเอาต์พุต เพื่อกำหนดเส้นทางไปยังไฟล์เดียวกันไปยัง "ฟองน้ำ" (มีอยู่ในแพ็คเกจ "moreutils" บนระบบฐาน Debian)
plugwash

ในการเขียนผลลัพธ์ไปยังไฟล์เดียวกันให้ใช้ subshellecho -n $(tr -d "\n" < yourfile.txt) > yourfile.txt
andpei


9
paste -sd "" file.txt

1
บน Solaris (10) paste -sd ""ไม่ทำงานบน STDIN ตามค่าเริ่มต้นดังนั้นหากคุณกำลังต่อท่อให้ใช้: (some command) | paste -sd "" -
JohnGH

วิธีนี้ใช้ไม่ได้หากคุณต้องการลบบรรทัดสุดท้ายด้วย จะลบบรรทัดใหม่ระดับกลางเท่านั้น
josch

สิ่งนี้ใช้ไม่ได้กับ Mac OS เวอร์ชันของ Sundeep ทำได้ paste -sd'\0' -
เทรนตัน

7
tr -d '\n' < file.txt

หรือ

awk '{ printf "%s", $0 }' file.txt

หรือ

sed ':a;N;$!ba;s/\n//g' file.txt

หน้านี้ที่นี่มีพวงของวิธีการอื่น ๆ เพื่อลบบรรทัดใหม่

แก้ไขเพื่อลบการละเมิดแมว :)


4

ใช้

head -n 1 filename | od -c 

เพื่อคิดว่าตัวละครที่กระทำผิดคืออะไร จากนั้นใช้

tr -d '\n' <filename

สำหรับ LF

tr -d '\r\n' <filename

สำหรับ CRLF



2

ใช้ man 1 ed:

# cf. http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed 
ed -s file <<< $'1,$j\n,p'  # print to stdout 
ed -s file <<< $'1,$j\nwq'  # in-place edit

2

Nerd fact: ใช้ ASCII แทน

tr -d '\012' < filename.extension   

(แก้ไขสาเหตุที่ฉันไม่เห็นคำตอบของ friggin ที่มีวิธีแก้ปัญหาเดียวกันข้อแตกต่างเพียงอย่างเดียวคือของฉันมี ASCII)


2

ใช้ sed กับคลาส POSIX

การดำเนินการนี้จะลบบรรทัดทั้งหมดที่มีเฉพาะช่องว่าง (ช่องว่างและแท็บ)

sed '/^[[:space:]]*$/d'

เพียงแค่ใช้สิ่งที่คุณกำลังทำงานอยู่และเชื่อมต่อกับสิ่งนั้น

ตัวอย่าง

cat filename | sed '/^[[:space:]]*$/d'


sed -i '/ ^ [[: space:]] * $ / d' ชื่อไฟล์ ... สำหรับการแก้ไขในสถานที่; คำตอบด้านบนจะแสดงขึ้นบนหน้าจอ
BradChesney79


1

หากข้อมูลอยู่ใน file.txt แล้ว:

echo $(<file.txt) | tr -d ' '

' $(<file.txt)' อ่านไฟล์และให้เนื้อหาเป็นชุดคำซึ่ง 'echo' จะสะท้อนโดยเว้นวรรคระหว่างคำเหล่านั้น คำสั่ง 'tr' จะลบช่องว่าง:

22791;14336;22821;34653;21491;25522;33238;

สิ่งนี้ใช้ได้ตราบเท่าที่อินพุตไม่ใหญ่เกินไปและตราบใดที่คุณใช้ Bash (ติดแท็กสำหรับ Bash ก็ไม่เป็นไร) ตอนนี้ฉันกำลังเขียนคำตอบอยู่หรือไม่tr -d '\n' < file.txtซึ่งเป็นสิ่งที่คำตอบที่ได้รับการยอมรับ (และฉันแปลกใจที่ไม่ได้เขียนในเวลานั้น) นี่อาจเป็นเพียงการเขียนเพื่อแสดงให้เห็นว่า 'ยังมีอีกวิธีหนึ่งที่จะทำได้'
Jonathan Leffler

1

xargs ใช้การขึ้นบรรทัดใหม่เช่นกัน (แต่เพิ่มบรรทัดสุดท้ายต่อท้าย):

xargs < file.txt | tr -d ' '

1

สมมติว่าคุณต้องการเก็บเฉพาะตัวเลขและอัฒภาคเท่านั้นสิ่งต่อไปนี้ควรใช้เคล็ดลับโดยสมมติว่าไม่มีปัญหาการเข้ารหัสที่สำคัญแม้ว่าจะลบ "newline" สุดท้ายออกไปด้วย:

$ tr -cd ";0-9"

คุณสามารถแก้ไขด้านบนเพื่อรวมอักขระอื่น ๆ ได้อย่างง่ายดายเช่นหากคุณต้องการคงจุดทศนิยมจุลภาค ฯลฯ


1

การใช้โปรแกรมแก้ไขข้อความ gedit (3.18.3)

  1. คลิกค้นหา
  2. คลิกค้นหาและแทนที่ ...
  3. ใส่\n\sลงไปในการค้นหาข้อมูล
  4. ปล่อยให้แทนที่ด้วยว่าง (ไม่มีอะไร)
  5. เลือกช่องนิพจน์ทั่วไป
  6. คลิกปุ่มค้นหา

หมายเหตุ: สิ่งนี้ไม่ได้ช่วยแก้ปัญหาเดิมของ OP ที่อายุ 7 ปี แต่ควรช่วยผู้ใช้ noob linux บางคน (เช่นฉัน) ที่หาทางมาที่นี่จาก SE ที่มีคำถาม "ฉันจะรับข้อความทั้งหมดในบรรทัดเดียว" ได้อย่างไร .


1

มีกรณีเดียวกันในวันนี้ง่ายมากในกลุ่มหรือ nvim คุณสามารถใช้gJเพื่อรวมสาย สำหรับกรณีการใช้งานของคุณเพียงแค่ทำ

99gJ

สิ่งนี้จะเข้าร่วมทั้งหมด 99 บรรทัดของคุณ คุณสามารถปรับจำนวนได้99ตามต้องการตามจำนวนบรรทัดที่จะเข้าร่วม ถ้าเพียงแค่เข้าร่วม1บรรทัดก็gJเพียงพอแล้ว


0

ฉันจะทำด้วย awk เช่น

awk '/[0-9]+/ { a = a $0 ";" } END { print a }' file.txt

(ข้อเสียคือ a "สะสม" ในหน่วยความจำ)

แก้ไข

ลืม printf! ก็เช่นกัน

awk '/[0-9]+/ { printf "%s;", $0 }' file.txt

หรือน่าจะดีกว่าสิ่งที่ได้ให้ไปแล้วใน ans อื่น ๆ โดยใช้ awk


0

ฉันมักจะได้รับ usecase นี้เมื่อฉันคัดลอกข้อมูลโค้ดจากไฟล์และฉันต้องการวางลงในคอนโซลโดยไม่ต้องเพิ่มบรรทัดใหม่ที่ไม่จำเป็นฉันลงเอยด้วยการทำนามแฝงทุบตี
(ฉันเรียกมันonelineว่าถ้าคุณอยากรู้อยากเห็น)

xsel -b -o | tr -d '\n' | tr -s ' ' | xsel -b -i
  • xsel -b -o อ่านคลิปบอร์ดของฉัน

  • tr -d '\n' ลบบรรทัดใหม่

  • tr -s ' ' ลบช่องว่างที่เกิดซ้ำ

  • xsel -b -i ดันกลับไปที่คลิปบอร์ดของฉัน

หลังจากนั้นฉันจะวางเนื้อหาใหม่ของคลิปบอร์ดลงใน oneline ในคอนโซลหรืออะไรก็ตาม


0

คุณไม่มีคำตอบที่ชัดเจนและรวดเร็วที่สุดโดยเฉพาะเมื่อคุณต้องทำสิ่งนี้ใน GUI เพื่อแก้ไขคำศัพท์แปลก ๆ

  • เปิด gedit

  • จากนั้นCtrl+ Hจากนั้นใส่ในFindช่องข้อความ\nและในReplace withพื้นที่ว่าง จากนั้นกรอกช่องทำเครื่องหมายRegular expressionและ voila


0

เพื่อลบบรรทัดต่อท้ายที่ท้ายไฟล์ด้วย

python -c "s=open('filename','r').read();open('filename', 'w').write(s.replace('\n',''))"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.