เมื่อฉันรันคำสั่งใน Bash (หรือเฉพาะเจาะจงwc -l < log.txt
) เอาต์พุตจะมี linebreak หลังจากนั้น ฉันจะกำจัดมันได้อย่างไร
เมื่อฉันรันคำสั่งใน Bash (หรือเฉพาะเจาะจงwc -l < log.txt
) เอาต์พุตจะมี linebreak หลังจากนั้น ฉันจะกำจัดมันได้อย่างไร
คำตอบ:
หากผลลัพธ์ที่คุณคาดหวังเป็นบรรทัดเดียวคุณสามารถลบอักขระบรรทัดใหม่ทั้งหมดออกจากผลลัพธ์ได้ มันจะไม่ผิดปกติไปป์ไปยังยูทิลิตี้ 'tr' หรือ Perl หากต้องการ:
wc -l < log.txt | tr -d '\n'
wc -l < log.txt | perl -pe 'chomp'
คุณยังสามารถใช้การทดแทนคำสั่งเพื่อลบบรรทัดขึ้นบรรทัดใหม่:
echo -n "$(wc -l < log.txt)"
printf "%s" "$(wc -l < log.txt)"
โปรดทราบว่าฉันไม่เห็นด้วยกับการตัดสินใจของ OP เพื่อเลือกคำตอบที่ยอมรับได้ ฉันเชื่อว่าควรหลีกเลี่ยงการใช้ 'xargs' หากเป็นไปได้ ใช่มันเป็นของเล่นที่ยอดเยี่ยม ไม่คุณไม่ต้องการที่นี่
หากผลลัพธ์ที่คาดหวังของคุณอาจมีหลายบรรทัดคุณต้องตัดสินใจอีกครั้ง:
หากคุณต้องการลบอักขระบรรทัดใหม่หลายรายการจากท้ายไฟล์ให้ใช้การทดแทน cmd อีกครั้ง:
printf "%s" "$(< log.txt)"
หากคุณต้องการลบอักขระบรรทัดใหม่ล่าสุดออกจากไฟล์ให้ใช้ Perl:
perl -pe 'chomp if eof' log.txt
โปรดทราบว่าถ้าคุณแน่ใจว่าคุณมีอักขระขึ้นบรรทัดใหม่ที่คุณต้องการลบคุณสามารถใช้ 'head' จาก GNU coreutils เพื่อเลือกทุกอย่างยกเว้นไบต์สุดท้าย นี่ควรจะค่อนข้างเร็ว:
head -c -1 log.txt
นอกจากนี้เพื่อความสมบูรณ์คุณสามารถตรวจสอบได้อย่างรวดเร็วว่าอักขระขึ้นบรรทัดใหม่ของคุณ (หรือพิเศษอื่น ๆ ) อยู่ในไฟล์ของคุณโดยใช้ 'cat' และธง 'show-all' อักขระเครื่องหมายดอลลาร์จะระบุจุดสิ้นสุดของแต่ละบรรทัด:
cat -A log.txt
tr --delete '\n'
ตัวเลือกการสอนยาวเช่นเดียวกับฟังก์ชั่นเช่น
| tr -d '\r'
ทางเดียว:
wc -l < log.txt | xargs echo -n
echo -n `wc -l log.txt`
IFS
) ไปยังพื้นที่หนึ่ง ตัวอย่าง: echo "a b" | xargs echo -n
; echo -n $(echo "a b")
. นี่อาจเป็นปัญหาของกรณีใช้งานหรือไม่ก็ได้
-e
echo
มันปลอดภัยกว่าที่จะใช้printf '%s'
เสมอ
xargs
ช้ามากในระบบของฉัน (และฉันสงสัยว่ามันเป็นระบบอื่น ๆ ด้วย) ดังนั้นprintf '%s' $(wc -l log.txt)
อาจเร็วกว่าเนื่องจากprintf
ปกติแล้วจะเป็นแบบบิลท์อิน (เช่นกันเนื่องจากไม่มีการเปลี่ยนเส้นทางข้อมูล) ไม่เคยใช้ backticks พวกเขาเลิกใช้แล้วในเวอร์ชัน POSIX ที่ใหม่กว่าและมีข้อเสียมากมาย
นอกจากนี้ยังมีการสนับสนุนโดยตรงสำหรับการลบช่องว่างในการแทนที่ตัวแปร Bash :
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
trailing_linebreak_removed=${testvar%?}
หากคุณกำหนดเอาต์พุตของมันให้กับตัวแปรให้ตัดbash
ช่องว่างออกโดยอัตโนมัติ:
linecount=`wc -l < log.txt`
printf ครอบตัดบรรทัดใหม่สำหรับคุณแล้ว:
$ printf '%s' $(wc -l < log.txt)
รายละเอียด:
%s
ยึดตำแหน่งสตริง %s\n
) จะไม่เกิดขึ้น"$(command)"
บรรทัดใหม่ภายในจะถูกเก็บไว้ - และบรรทัดใหม่ที่ต่อท้ายเท่านั้นที่จะถูกลบออก เปลือกทำทุกงานที่นี่ - เป็นเพียงวิธีการเพื่อนำผลลัพธ์ของคำสั่งเปลี่ยนตัวกลับไปยังprintf
stdout
$( )
โครงสร้าง นี่คือข้อพิสูจน์:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
หากคุณต้องการลบเฉพาะบรรทัดใหม่ล่าสุดให้เลื่อนไปตาม:
sed -z '$ s/\n$//'
sed
จะไม่เพิ่ม a \0
ถึงจุดสิ้นสุดของสตรีมหากตัวคั่นถูกตั้งค่าเป็นNUL
ผ่าน-z
ในขณะที่สร้างไฟล์ข้อความ POSIX (กำหนดเป็นสิ้นสุดใน a \n
) มันจะส่งออกสุดท้าย\n
โดยไม่ต้องใช้-z
เสมอ
เช่น:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender
และเพื่อพิสูจน์ว่าไม่มีการNUL
เพิ่ม:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72 foo.bar
หากต้องการลบบรรทัดใหม่ที่ต่อท้ายหลายรายการให้ไพพ์ผ่าน:
sed -Ez '$ s/\n+$//'
sed
-z
หากคุณต้องการพิมพ์เอาต์พุตของสิ่งใด ๆ ใน Bash โดยไม่ต้องวางสายคุณจะต้องแสดงด้วย-n
สวิตช์
หากคุณมีมันอยู่ในตัวแปรแล้วสะท้อนให้เห็นด้วยการขึ้นบรรทัดใหม่ตัดต่อท้าย :
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
หรือคุณสามารถทำได้ในหนึ่งบรรทัดแทน:
$ echo -n $(wc -l < log.txt)
echo -n $(wc -l < log.txt)
มีผลเหมือนกัน