เป็นไปได้หรือไม่ที่จะหาบรรทัดในไฟล์ที่มีความยาวเกิน 79 ตัวอักษร?
เป็นไปได้หรือไม่ที่จะหาบรรทัดในไฟล์ที่มีความยาวเกิน 79 ตัวอักษร?
คำตอบ:
เพื่อลดความเร็ว (ในระบบ GNU ในภาษา UTF-8 และ ASCII input) ตามการทดสอบของฉัน:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
ยกเว้นperl
¹หนึ่ง (หรือสำหรับawk
/ grep
/ sed
การใช้งาน (ชอบmawk
หรือ busybox) ที่ไม่สนับสนุนอักขระหลายไบต์) ที่นับยาวในแง่ของจำนวนตัวอักษร (ตามLC_CTYPE
การตั้งค่าของสถานที่เกิดเหตุ) แทนไบต์
หากมีไบต์ในอินพุตที่ไม่ได้เป็นส่วนหนึ่งของอักขระที่ถูกต้อง (ซึ่งบางครั้งเกิดขึ้นเมื่อชุดอักขระของโลแคลคือ UTF-8 และอินพุตอยู่ในการเข้ารหัสที่แตกต่างกัน) จากนั้นขึ้นอยู่กับการใช้งานโซลูชันและเครื่องมือ อย่างใดอย่างหนึ่งจะนับเป็น 1 ตัวอักษรหรือ 0 .
หรือไม่ตรง
ตัวอย่างเช่นบรรทัดที่ประกอบด้วย 30 a
sa 0x80 byte, 30 b
s, 0x81 byte และ 30 UTF-8 é
s (เข้ารหัสเป็น 0xc3 0xa9) ในโลแคล UTF-8 จะไม่ตรง.\{80\}
กับ GNU grep
/ sed
(ในรูปแบบ standalone 0x80 byte ไม่ตรง.
) จะมีความยาว 1 + 30 + 30 + 1 + 2 * 30 = 122 ด้วยperl
หรือmawk
3 * 30 = gawk
90
หากคุณต้องการที่จะนับในแง่ของไบต์แก้ไขสถานที่จะมีC
LC_ALL=C grep/awk/sed...
นั่นจะมีวิธีแก้ปัญหาทั้งหมด 4 ข้อพิจารณาว่าบรรทัดด้านบนมี 122 ตัวอักษร ยกเว้นในperl
และเครื่องมือ GNU คุณยังคงมีปัญหาที่อาจเกิดขึ้นกับบรรทัดที่มีอักขระ NUL (0x0 ไบต์)
¹ perl
พฤติกรรมได้รับผลกระทบโดยPERL_UNICODE
ตัวแปรสภาพแวดล้อมแม้ว่า
awk
สามารถเข้ามาใกล้มากขึ้นถ้าคุณดรอป($0)
ซึ่งโดยปริยายอยู่แล้ว;)
^
grep '^.\{80\}' file
grep '^.\{1000\}' file
ส่งคืนgrep: invalid repetition count(s)
ขณะที่ทำawk 'length>1000' file
สำเร็จ)
วิธีเชลล์:
while IFS= read -r line || [ -n "$line" ];
do
[ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt
วิธีการหลาม:
python -c 'import sys;f=open(sys.argv[1]);print "\n".join([ l.strip() for l in f if len(l) >79 ]);f.close()' input.txt
หรือเป็นสคริปต์สั้น ๆ เพื่อให้อ่านง่าย:
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if len(line) > 79:
print line.strip()
หากเราต้องการยกเว้นอักขระขึ้นบรรทัดใหม่\n
จากการคำนวณเราสามารถif len(line) > 79
ทำได้if len(line.strip()) > 79
หมายเหตุด้านข้าง: นี่คือไวยากรณ์ Python 2.7 ใช้print()
สำหรับ Python 3