ฉันพบคำถามเกี่ยวกับวิธีลบบรรทัดที่ยาวกว่า 2048 ตัวอักษร:
ถาม:แต่ฉันจะลบเส้นที่สั้นกว่าตัวอักษร 4 ตัวได้อย่างไร ดังนั้นลบบรรทัดที่มีความยาว 1 หรือ 2 หรือ 3 ไฟล์
อัปเดต: ขอบคุณสำหรับคำตอบที่ดีมากมาย แต่ฉันสามารถทำเครื่องหมายว่าตกลงเท่านั้น
ฉันพบคำถามเกี่ยวกับวิธีลบบรรทัดที่ยาวกว่า 2048 ตัวอักษร:
ถาม:แต่ฉันจะลบเส้นที่สั้นกว่าตัวอักษร 4 ตัวได้อย่างไร ดังนั้นลบบรรทัดที่มีความยาว 1 หรือ 2 หรือ 3 ไฟล์
อัปเดต: ขอบคุณสำหรับคำตอบที่ดีมากมาย แต่ฉันสามารถทำเครื่องหมายว่าตกลงเท่านั้น
คำตอบ:
sed
คุณสามารถใช้ ต่อไปนี้จะลบบรรทัดที่ยาวไม่เกิน 3 ตัวอักษร:
sed -r '/^.{,3}$/d' filename
เพื่อบันทึกการเปลี่ยนแปลงของไฟล์แบบแทนที่-i
ตัวเลือก
หากเวอร์ชันของคุณsed
ไม่รองรับไวยากรณ์ RE ที่ขยายเพิ่มคุณสามารถเขียนเหมือนกันใน BRE:
sed '/^.\{,3\}$/d' filename
ซึ่งจะทำงานกับsed
ตัวแปรทั้งหมด
คุณสามารถใช้awk
:
awk 'length($0)>3' filename
การใช้perl
:
perl -lne 'length()>3 && print' filename
บางรูปแบบเพิ่มเติม:
grep .... file
หรือ
sed '/..../!d' file
หรือ
sed -n 's/./&/4p' file
หรือ
awk 'gsub(/./,"&")>3' file
หรือ
awk 'length>3' file
หรือ GNU awk:
awk 'NF>3' FS= file
นี่คือโซลูชัน Vim โดยใช้โหมด Ex ของ Vim และglobal
คำสั่ง
สิ่งนี้คล้ายกับการใช้งานsed
มากเท่านั้นจึงต้องมีการหลีกเลี่ยงตัวอักษรพิเศษ ('{', '}')
:g/^.\{,3\}$/d
การใช้โหมด Very Magic Regex (\ v) ของการหลบหลีกนี้สามารถหลีกเลี่ยงได้
:g/\v^.{,3}$/d
ดูเพิ่มเติม: ช่วยเวทมนต์
Use of "\v" means that in the pattern after it all ASCII characters except
'0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning. "very magic"
vglobal
นอกจากนี้ยังมีบางครั้งที่จะทำตรงข้ามกับ
:v/\v^.{,3}$/d
จะลบทุกอย่างยกเว้นบรรทัดจนถึง 3 ตัวอักษร
เพื่อลบบรรทัดที่คุณทำได้โดยตรง:
sed -ri '/.{4}/!d' /path/to/file
หรือ BRE:
sed -i '/.\{4\}/!d' /path/to/file
หากบรรทัดไม่มีอักขระ 4 ตัวขึ้นไปจะถูกลบออก
f=/path/to/file
cat <<GREP >"$f"
$(grep -E ".{4}" "$f")
GREP
การทำข้างต้นใน subshell คำสั่งการแทนที่จะทำให้แน่ใจว่าgrep
ได้รับ descriptor การอ่านก่อนที่ cat จะเริ่มเขียนมัน แต่<<HEREDOC
จะยังให้แน่ใจว่าผลลัพธ์ยังคงเป็นสตรีมและไม่ทำให้เกิดข้อผิดพลาดเกี่ยวกับความยาวอาร์กิวเมนต์
sed '/^.\?.\?.\?$/d' input.txt > output.txt
คุณสามารถใช้grep
:
หากคุณนับช่องว่างนำในความยาวบรรทัด:
grep -e '[^\ ]\{4,\}' file
หากคุณไม่นับการเว้นวรรคนำในแนวบรรทัด:
grep -e '[^\]\{4,\}' file
sed '/^.\{,3\}$/d'
ไม่ได้ทำงานกับ BSDsed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s)
sed: รุ่น sed -r นั้นมีความถูกต้องทางไวยากรณ์ แต่จะไม่ลบบรรทัด