ฉันจะพิมพ์เอาต์พุตหลายบรรทัดบนบรรทัดเดียวกันได้อย่างไร


16

มีวิธีการพิมพ์เอาต์พุตหลายบรรทัด (เอาต์พุตเดี่ยว) ในบรรทัดเดียวกันหรือไม่?

ตัวอย่างเช่นถ้าผลลัพธ์คือ:

abc
def
qwerty

เป็นไปได้ไหมที่จะพิมพ์:

abcdefqwerty 

คำตอบ:


13

tr -dคุณสามารถลบที่เกิดขึ้นทั้งหมดของตัวละครจากชุดที่กำหนดด้วย ในการลบอักขระบรรทัดใหม่ให้ใช้:

tr -d '\n'

เช่นเคยคุณสามารถใช้การเปลี่ยนทิศทางอินพุตและเอาต์พุตและไพพ์เพื่ออ่านหรือเขียนไฟล์และกระบวนการอื่น ๆ

หากคุณต้องการขึ้นบรรทัดใหม่ล่าสุดคุณก็สามารถเพิ่มมันกลับด้วยechoหรือprintf '\n'เช่น:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt

10

มีหลายวิธี เพื่ออธิบายฉันได้บันทึกตัวอย่างของคุณในfile:

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | perl -pe 's/\n//'
abcdefqwerty$ 

ซึ่งจะลบอักขระบรรทัดใหม่ทั้งหมดรวมถึงอักขระตัวสุดท้าย คุณอาจต้องการ:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty

ผมคิดว่าprintf+ cat+ perlคำสั่งผสมจะดีดำเนินการผ่านperl -pe 's/\n//;END{printf "\n"}' input.txt ขั้นตอนเดียวไม่มีคำสั่งเปลี่ยนตัวและล้อเล่นกับคำพูดและไม่มี UUOC บางที.
Sergiy Kolodyazhnyy

7

คุณสามารถไพพ์เอาท์พุทหลายบรรทัดผ่าน awk

awk '{printf "%s",$0} END {print ""}'

หรือใช้sed:

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

ตัวอย่างการวิ่ง

$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'              
1234

อ่านเพิ่มเติม: ลบตัวแบ่งบรรทัดโดยใช้ AWK · serverfault.SE



2

หากคุณต้องการใช้ Perl สำหรับสิ่งนี้คุณสามารถใช้chompฟังก์ชัน:

perl -pe chomp

รายละเอียดเพิ่มเติมบางอย่างสำหรับผู้ที่สนใจ

คุณสามารถส่งหนึ่งชื่อไฟล์ขึ้นไปเป็นอาร์กิวเมนต์ที่ตามมา

perl -pe chomp file1 file2 file3

ในบางกรณีคุณอาจไม่ต้องการทำเช่นนั้นแต่คุณสามารถไพพ์หรือเปลี่ยนเส้นทางไปยังคำสั่งนั้นแทน (ความสามารถเหล่านี้ - และข้อแม้นั้น - ทั้งหมดนำไปใช้กับอื่น ๆperl -pหรือperl -nโซลูชันตามเช่นกัน)

ดังนั้นหากคุณต้องการประมวลผลเอาต์พุตจากการรันsome-command:

some-command | perl -pe chomp

นี้อาจเป็นได้เร็วกว่าคำสั่ง Perl ในคำตอบของ terdon อักขระ\nขึ้นบรรทัดใหม่(แสดงโดย) จะปรากฏที่ส่วนท้ายของบรรทัดในสถานการณ์นี้ - เนื่องจากเป็นสิ่งที่ Perl ใช้ในการตัดสินใจว่าแต่ละบรรทัดจะจบลงที่ใด s/\n//ค้นหาบรรทัดใหม่ทั้งหมดเพื่อหาบรรทัดใหม่ในขณะที่chompเพิ่งลบบรรทัดที่ท้าย (ถ้ามีตามที่บรรทัดสุดท้ายอาจจะมีหรือไม่มีก็ได้)

chompผลการดำเนินงานอาจไม่ได้จริงๆเป็นเหตุผลหลักที่จะชอบ perlคำสั่งในคำตอบ terdon ของเท่านั้นจะช้าลงเล็กน้อยถ้าคุณกำลังประมวลผลไฟล์ขนาดใหญ่ที่มีสายยาวมาก และถ้าคุณต้องการความเร็วทางของ David Foersterก็อาจเร็วกว่านี้ chompเป็นอย่างไรก็ตามเครื่องมือที่เหมาะสมสำหรับสิ่งนี้ถ้าคุณใช้ Perl และฉันคิดว่าเจตนาchompมันชัดเจนกว่านั้นs/\n//เป็นที่ชัดเจนกว่าในที่สุดอาจไม่มีคำตอบที่เป็นวัตถุประสงค์ซึ่งดีกว่า

การพิมพ์บรรทัดใหม่ขั้นสุดท้าย

อย่างไรก็ตามฉันขอแนะนำให้ต่อต้านการใช้การทดแทนคำสั่ง ( $( )) เพียงเพื่อให้แน่ใจว่าบรรทัดใหม่ต่อท้ายได้รับการพิมพ์ ถ้าข้อความที่คุณกำลังประมวลผลสั้นนั้นน่าจะค่อนข้างช้า - ต้องรวบรวมข้อความทั้งหมดในครั้งเดียวแล้วพิมพ์มัน - และทำให้คำสั่งของคุณเข้าใจยากขึ้น คุณสามารถทำตามที่ David Foerster แนะนำและเรียกใช้echoหรือprintf '\n'หลังจากนั้น

perl -pe chomp; echo

หากคุณกำลังไพพ์จากหรือ (ตามที่ David Foerster แสดง) การเปลี่ยนทิศทางจากคำสั่งนั้นคุณสามารถใส่คำสั่งนั้น{ ;}เพื่อให้เอาต์พุตของทั้งสองคำสั่งถูกรวมเข้าด้วยกัน หากคุณเพิ่งพิมพ์ไปยังเครื่องเทอร์มินัลคุณสามารถเรียกใช้งานได้ตามที่แสดงไว้ด้านบน สิ่งนี้ใช้ได้แม้ว่าคุณจะไพพ์หรือเปลี่ยนเส้นทางไปยังคำสั่งเนื่องจากecho/ printf '\n'ไม่ได้อ่านอินพุตใด ๆ นั่นคืองานนี้:

some-command | perl -pe chomp; echo

ขณะที่อยู่ที่นี่คุณไม่สามารถลบ{ ;}:

{ perl -pe chomp; echo; } | some-other-command

หรือหากคุณต้องการคุณสามารถperlพิมพ์บรรทัดใหม่สุดท้ายได้เอง เช่นเดียวกับที่ล้อมรอบperlและechoคำสั่งใน{ ;}วิธีนี้ทำงานแม้ว่าคุณท่อหรือเปลี่ยนเส้นทางกำลังจากมัน (และเช่นเดียวกับทุกวิธีการทำงานนี้เมื่อคุณท่อกำลังจะมันเกินไป):

perl -wpe 'chomp; END { print "\n" }'

โปรดทราบว่าคำสั่งในคำตอบของ terdon ทำงานได้ดีกับวิธีการพิมพ์บรรทัดใหม่สุดท้ายเหล่านี้เช่นกัน ตัวอย่างเช่น:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'

perl -wpe 'chomp; END { print "\n" } เป็นกระบวนการเดียวกันมีข้อได้เปรียบเล็กน้อยในการเพิ่มเสียงสะท้อน
Sergiy Kolodyazhnyy


1

คำตอบนี้มีวิธีการแก้ไขปัญหาที่คุณพยายามสร้าง: ทำไมทุบตีลบ \ n เป็น $ (ไฟล์ cat)?

หากคุณพิมพ์cat myfile.txtคุณจะเห็น:

abc
def
ghi

แต่ถ้าคุณพิมพ์echo $(cat myfile.txt)คุณจะเห็น:

abc def ghi

หมายเหตุวิธีนี้จะแทรกช่องว่างที่มีการแบ่งบรรทัดใหม่ สิ่งนี้ทำให้การอ่านง่ายขึ้น แต่ไม่ปฏิบัติตามขอบเขตคำถามของคุณอย่างเคร่งครัด


0

หากคุณกำลังใช้ Bash คุณสามารถทำได้โดยไม่ต้องใช้เครื่องมือภายนอก

x=($(echo line1; echo line2))
echo "${x[@]}"

ผลลัพธ์:

line1 line2

คำสั่งแรกเปลี่ยนเอาต์พุตหลายบรรทัดเป็นอาร์เรย์คำสั่งที่สองขยายอาร์เรย์ออกเป็นหลายอาร์กิวเมนต์ในหนึ่งบรรทัด

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