wc -L รายงานความยาวบรรทัด 8 สำหรับ tab-char ข้อผิดพลาดหรือคุณสมบัติ?


12

-Lเป็นคุณสมบัติที่มีประโยชน์ของwcหรือดังนั้นฉันคิดว่า มันพิมพ์ความยาวของบรรทัดที่ยาวที่สุด ด้วยเหตุผลบางอย่างมันขยายแท็บเดี่ยวไบต์ถึงความยาว 8
มีวิธีการตั้งค่านี้เพื่อไม่ "ขยาย" แท็บ? และอะไรคือเหตุผลเบื้องหลังการขยายตัวนี้

echo -n $'\t' | wc -L

เอาท์พุท 8

wc (coreutils ของ GNU) 7.4
bash ของ GNU, รุ่น 4.1.5


-n คือ orthogonal สำหรับคำถาม
ผู้ใช้ไม่รู้จัก

คำตอบ:


11

ฉันพบว่าไม่มีรายงานข้อผิดพลาดที่เกี่ยวข้องกับเรื่องนี้และบรรทัดต่อไปนี้ในไฟล์ต้นฉบับ wc.c

    case '\t':
        linepos += 8 - (linepos % 8);

ดูเหมือนว่าจงใจเลือกที่จะทำงานในลักษณะนี้อาจจะให้คำแนะนำสำหรับความกว้างที่จำเป็นในการแสดงไฟล์บนหน้าจอ

ทางเลือกที่รวดเร็วอาจเป็น

echo -n $'\t' | tr '\t' ' ' | wc -L

2
ขอบคุณ enzo ตอนนี้ฉันพบแล้วว่าถึงแม้man wcจะไม่ได้กล่าวถึงปัญหานี้ แต่ก็มีการระบุไว้ในinfo coreutils 'wc invocation'(ซึ่งหมายถึง 'man' ด้วย) ... นอกจากนี้หลังจาก trawling google-sphere อีกเล็กน้อยฉันพบสิ่งนี้เป็นทางเลือกecho -n $'\t' | expand -t1 | wc -Lซึ่งค่อนข้างเหมือนกันกับทางเลือกของคุณ แต่ฉันได้โยนทิ้งไปเพื่อวัดผลที่ดี .. และแม้ว่าลิงค์ต่อไปนี้จะเป็นการแฮ็กคอมไพล์ wcซ้ำ*มันอาจเป็นที่สนใจสำหรับบางคน: wc รองรับความกว้างแท็บที่แตกต่างกัน
Peter.O

1

โดยปกติแท็บจะขยายไปยังตำแหน่งถัดไป (หารด้วย 8) +1 [1, 9, 17, 25, ...]ดังนั้นหากคุณถามคุณจะได้รับ

โปรดทราบว่า -n ไม่เกี่ยวข้องกับคำถาม แต่ $ ไม่ใช่

echo foo$'\t' | wc -L

จะกลับมา 8 เช่นกันเพราะ

echo foo$'\t'bar 
foo     bar

คุณสามารถละเว้น $ ถ้าคุณใช้ -e สำหรับ echo:

echo -e '\t' | wc -L
8

ดังนั้นหากคุณต้องการนับ '\ t' เป็นไบต์เดียวให้ละเว้น -e และ $:

echo '\t' | wc -L
2

ใช่แท็บที่ขยายเป็นเรื่องธรรมดาพอสำหรับผลลัพธ์ที่พิมพ์ / แสดง แต่ฉันพบว่ามันแปลกที่โปรแกรมที่นับไบต์และคำพูดจะนับ1ตัวอักษรเป็นสิ่งอื่นที่ไม่ใช่ตัวอักษร1ตัว ... btw echo '\t'ไม่ได้ส่งแท็บ -char (\ x09) มันส่งออกสายที่มีความยาว 2 คือ และ'\' 't'ขึ้นบรรทัดใหม่ไม่ได้หมอนี่ของความยาวของเส้น ... (ฉันมี-nในตัวอย่างของฉันเพื่อตรวจสอบว่าwcถูกต้องจะประมวลผลไฟล์ซึ่งไม่มีต่อท้ายบรรทัดใหม่-ถ่าน ... )
Peter.O

wc --helpพูดว่า: -L, --max-line-length print the length of the longest line?. มันไม่ได้พูดถึงไบต์ แต่ความยาวบรรทัด
ไม่ทราบผู้ใช้

1
ใช่มันจะพูดว่า"พิมพ์ความยาวของบรรทัดที่ยาวที่สุด" ... `แต่มันไม่ได้พูดว่า " เราคิดว่าคุณต้องการให้แท็บขยาย (ไม่นับตัวอักษรปกติเช่นฟังก์ชั่นความยาวอื่น ๆ ) .. โอ้โดย ทางเราจะขยายแท็บเป็น 8 ช่องว่างไม่ว่าแท็บใดที่คุณตั้งไว้จะหยุด " ... นั่นคือกับดัก .. มันบันทึกไว้ไม่ถูกต้อง
Peter.O

คุณตั้งค่าแท็บอย่างไร ในทุบตี? นอกจากนี้: แท็บไม่ได้ขยายเป็น 8 ช่องว่าง แต่ไปที่ตำแหน่งดูecho -e foo'\t'bar | wc -Lว่าผลลัพธ์ใดใน 11 ไม่ใช่ 14
ผู้ใช้ที่ไม่รู้จัก

ในข้างต้นfoo\tbarตัวอย่างเช่นwcมีการสันนิษฐานว่าแท็บหยุดที่ระยะห่างเล็กน้อยจาก8 ... แสดงให้เห็นตัวอย่างต่อไปนี้วิธีการwcละเว้นการตั้งค่าแท็บหยุดใช้งานในปัจจุบัน มันออกสายไปยังสถานีซึ่งเป็นสถานีที่ 8 คอลัมน์กว้าง / ยาวยังwcรายงานว่ามันจะเป็นเช่นนี้ 11. ชุดแท็บหยุดคอลัมน์ 6 ทุก ...tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O

0

คำอธิบาย wc -L ไม่ชัดเจน ส่งคืนความกว้างการแสดงผลที่กว้างที่สุด เพื่อควบคุมการขยายแท็บคุณสามารถกรองผ่านexpandก่อน

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