สมมติว่าคุณมีไฟล์นี้:
$ cat /tmp/test.txt
Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR
มีองค์ประกอบสี่อย่างที่จะเปลี่ยนความหมายของเอาต์พุตไฟล์ที่อ่านโดยโซลูชัน Bash จำนวนมาก:
- บรรทัดว่าง 4
- ช่องว่างนำหน้าหรือต่อท้ายบนสองบรรทัด
- การรักษาความหมายของแต่ละบรรทัด (เช่นแต่ละบรรทัดเป็นบันทึก);
- บรรทัด 6 ไม่สิ้นสุดด้วย CR
หากคุณต้องการบรรทัดไฟล์ข้อความทีละบรรทัดรวมถึงบรรทัดว่างและบรรทัดที่ยกเลิกโดยไม่มี CR คุณต้องใช้การวนลูป while และคุณต้องทำการทดสอบทางเลือกสำหรับบรรทัดสุดท้าย
นี่คือวิธีการที่อาจเปลี่ยนแปลงไฟล์ (เปรียบเทียบกับสิ่งที่cat
ส่งคืน):
1) สูญเสียบรรทัดสุดท้ายและช่องว่างนำหน้าและต่อท้าย:
$ while read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
(ถ้าคุณทำwhile IFS= read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
แทนคุณรักษาช่องว่างนำหน้าและต่อท้าย แต่ยังคงสูญเสียบรรทัดสุดท้ายหากยังไม่สิ้นสุดด้วย CR)
2) การใช้การทดแทนกระบวนการด้วยcat
จะอ่านไฟล์ทั้งหมดในหนึ่งอึกและสูญเสียความหมายของแต่ละบรรทัด:
$ for p in "$(cat /tmp/test.txt)"; do printf "%s\n" "'$p'"; done
'Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR'
(ถ้าคุณลบออก"
จาก$(cat /tmp/test.txt)
คุณอ่านคำไฟล์โดยคำมากกว่าหนึ่งอึกนอกจากนี้ยังอาจไม่ได้ตั้งใจ ... )
วิธีที่แข็งแกร่งที่สุดและง่ายที่สุดในการอ่านไฟล์แบบบรรทัดต่อบรรทัดและรักษาระยะห่างทั้งหมดคือ:
$ while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
' Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space '
'Line 6 has no ending CR'
หากคุณต้องการตัดส่วนนำและพื้นที่ซื้อขายออกให้นำชิ้นIFS=
ส่วนออก:
$ while read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
'Line 6 has no ending CR'
(ไฟล์ข้อความที่ไม่มีการยุติ\n
ในขณะที่เป็นเรื่องปกติจะถือว่าใช้งานไม่ได้ภายใต้ POSIX หากคุณสามารถเชื่อใจการติดตามที่\n
คุณไม่ต้องการ|| [[ -n $line ]]
ในwhile
ลูป)
เพิ่มเติมที่คำถามที่พบบ่อยทุบตี