จะลบบรรทัดที่สั้นกว่า XY ได้อย่างไร


29

ฉันพบคำถามเกี่ยวกับวิธีลบบรรทัดที่ยาวกว่า 2048 ตัวอักษร:

วิธีลบบรรทัดถ้ายาวกว่า XY

ถาม:แต่ฉันจะลบเส้นที่สั้นกว่าตัวอักษร 4 ตัวได้อย่างไร ดังนั้นลบบรรทัดที่มีความยาว 1 หรือ 2 หรือ 3 ไฟล์

อัปเดต: ขอบคุณสำหรับคำตอบที่ดีมากมาย แต่ฉันสามารถทำเครื่องหมายว่าตกลงเท่านั้น

คำตอบ:


42

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

sed '/^.\{,3\}$/d'ไม่ได้ทำงานกับ BSD sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s)sed: รุ่น sed -r นั้นมีความถูกต้องทางไวยากรณ์ แต่จะไม่ลบบรรทัด
Dereckson

5

บางรูปแบบเพิ่มเติม:

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

1
โอ้ grep .... มันช่างงดงามเหลือเกิน!
grofte

3

นี่คือโซลูชัน 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 ตัวอักษร


1

เพื่อลบบรรทัดที่คุณทำได้โดยตรง:

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จะยังให้แน่ใจว่าผลลัพธ์ยังคงเป็นสตรีมและไม่ทำให้เกิดข้อผิดพลาดเกี่ยวกับความยาวอาร์กิวเมนต์



0

คุณสามารถใช้grep:

หากคุณนับช่องว่างนำในความยาวบรรทัด:

grep -e '[^\ ]\{4,\}' file

หากคุณไม่นับการเว้นวรรคนำในแนวบรรทัด:

grep -e '[^\]\{4,\}' file
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.