วิธีแรก ( 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
อาจไม่ทำงานในสถานที่ที่ไม่ใช่ภาษาอังกฤษ