มีวิธีการพิมพ์เอาต์พุตหลายบรรทัด (เอาต์พุตเดี่ยว) ในบรรทัดเดียวกันหรือไม่?
ตัวอย่างเช่นถ้าผลลัพธ์คือ:
abc
def
qwerty
เป็นไปได้ไหมที่จะพิมพ์:
abcdefqwerty
มีวิธีการพิมพ์เอาต์พุตหลายบรรทัด (เอาต์พุตเดี่ยว) ในบรรทัดเดียวกันหรือไม่?
ตัวอย่างเช่นถ้าผลลัพธ์คือ:
abc
def
qwerty
เป็นไปได้ไหมที่จะพิมพ์:
abcdefqwerty
คำตอบ:
tr -d
คุณสามารถลบที่เกิดขึ้นทั้งหมดของตัวละครจากชุดที่กำหนดด้วย ในการลบอักขระบรรทัดใหม่ให้ใช้:
tr -d '\n'
เช่นเคยคุณสามารถใช้การเปลี่ยนทิศทางอินพุตและเอาต์พุตและไพพ์เพื่ออ่านหรือเขียนไฟล์และกระบวนการอื่น ๆ
หากคุณต้องการขึ้นบรรทัดใหม่ล่าสุดคุณก็สามารถเพิ่มมันกลับด้วยecho
หรือprintf '\n'
เช่น:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
มีหลายวิธี เพื่ออธิบายฉันได้บันทึกตัวอย่างของคุณใน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
คุณสามารถไพพ์เอาท์พุทหลายบรรทัดผ่าน 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
นอกจากนี้your_command | paste -sd ''
ซึ่งรักษาบรรทัดขึ้นต่อท้าย
หากคุณต้องการใช้ 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" }
เป็นกระบวนการเดียวกันมีข้อได้เปรียบเล็กน้อยในการเพิ่มเสียงสะท้อน
ใช้วิธีเชลล์เท่านั้น:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
คำตอบนี้มีวิธีการแก้ไขปัญหาที่คุณพยายามสร้าง: ทำไมทุบตีลบ \ n เป็น $ (ไฟล์ cat)?
หากคุณพิมพ์cat myfile.txt
คุณจะเห็น:
abc
def
ghi
แต่ถ้าคุณพิมพ์echo $(cat myfile.txt)
คุณจะเห็น:
abc def ghi
หมายเหตุวิธีนี้จะแทรกช่องว่างที่มีการแบ่งบรรทัดใหม่ สิ่งนี้ทำให้การอ่านง่ายขึ้น แต่ไม่ปฏิบัติตามขอบเขตคำถามของคุณอย่างเคร่งครัด
หากคุณกำลังใช้ Bash คุณสามารถทำได้โดยไม่ต้องใช้เครื่องมือภายนอก
x=($(echo line1; echo line2))
echo "${x[@]}"
ผลลัพธ์:
line1 line2
คำสั่งแรกเปลี่ยนเอาต์พุตหลายบรรทัดเป็นอาร์เรย์คำสั่งที่สองขยายอาร์เรย์ออกเป็นหลายอาร์กิวเมนต์ในหนึ่งบรรทัด
printf
+cat
+perl
คำสั่งผสมจะดีดำเนินการผ่านperl -pe 's/\n//;END{printf "\n"}' input.txt
ขั้นตอนเดียวไม่มีคำสั่งเปลี่ยนตัวและล้อเล่นกับคำพูดและไม่มี UUOC บางที.