วิธีแรก ( grep
):
นับจำนวนบรรทัดที่มีการขึ้นบรรทัดใหม่:
[[ $(grep -c $'\r' myfile.txt) -gt 0 ]] && echo dos
นับจำนวนบรรทัดที่ลงท้ายด้วย carriage return:
[[ $(grep -c $'\r$' myfile.txt) -gt 0 ]] && echo dos
โดยทั่วไปจะเทียบเท่า การขึ้นบรรทัดใหม่กลับด้านในของเส้น (เช่นไม่ใช่ที่จุดสิ้นสุด) นั้นหายาก
มีประสิทธิภาพมากกว่า:
grep -q $'\r' myfile.txt && echo dos
นี้มีประสิทธิภาพมากขึ้น
- เพราะมันไม่จำเป็นต้องแปลงจำนวนเป็นสตริง ASCII แล้วแปลงสตริงนั้นกลับไปเป็นจำนวนเต็มและเปรียบเทียบกับศูนย์และ
- เพราะ
grep -c
จำเป็นต้องอ่านไฟล์ทั้งหมดเพื่อนับการเกิดขึ้นทั้งหมดของรูปแบบในขณะที่grep -q
สามารถออกจากเมื่อเห็นการเกิดขึ้นครั้งแรกของรูปแบบ
หมายเหตุ:
- ตลอดข้างต้นคุณอาจต้องเพิ่ม
-U
ตัวเลือก (เช่นใช้-cU
หรือ-qU
) เนื่องจาก GNU grep
เดาว่าไฟล์นั้นเป็นไฟล์ข้อความหรือไม่ หากคิดว่าไฟล์เป็นข้อความมันจะละเว้นการขึ้นบรรทัดใหม่ที่ท้ายบรรทัดในความพยายามที่จะทำให้$
นิพจน์ทั่วไปทำงาน "ถูกต้อง" - แม้ว่านิพจน์ทั่วไปจะเป็น\r$
! การระบุ-U
(หรือ--binary
) ลบล้างการคาดเดานี้ทำให้grep
เป็นไฟล์ไบนารีและส่งผ่านข้อมูลไปยังกลไกการจับคู่คำต่อคำด้วย CR-endings เหมือนเดิม
- อย่าทำ
grep … $'\r\n' myfile.txt
เพราะgrep
ถือว่า\n
เป็นตัวคั่นรูปแบบ เช่นเดียวกับการgrep -E 'foo|'
ค้นหาบรรทัดที่มีfoo
หรือสตริง null
grep $'\r\n'
ค้นหาบรรทัดที่มี\r
หรือสตริง null และทุกบรรทัดตรงกับสตริง null
วิธีที่สอง ( file
):
[[ $(file myfile.txt) =~ CRLF ]] && echo dos
เพราะfile
รายงานสิ่งที่ชอบ:
myfile.txt: UTF-8 Unicode text, with CRLF line terminators
ตัวแปรที่ปลอดภัยกว่า:
[[ $(file -b - < myfile.txt) =~ CRLF ]] && echo dos
ที่ไหน
ระวังว่าการตรวจสอบผลลัพธ์จากfile
อาจไม่ทำงานในสถานที่ที่ไม่ใช่ภาษาอังกฤษ