วิธีลบบรรทัดจากไฟล์ที่ไม่มีจุด?


10

ฉันมีไฟล์ที่มีข้อมูลรวมถึง URL แต่มีหลายสายที่ไม่ใช่ URL ฉันจะลบออกโดยใช้คำสั่งเทอร์มินัลของ Ubuntu ได้อย่างไร

นี่คือไฟล์ตัวอย่างสำหรับการอ้างอิง: ข้อมูลตัวอย่าง

com.blendtuts/S
°=
com.blengineering.www/:http
±=

ฉันต้องการเอาท์พุท:

com.blendtuts/S
com.blengineering.www/:http

เส้นที่ไม่ต้องการพิเศษนั้นไม่มีจุดใด ๆ ดังนั้นฉันต้องการลบบรรทัดที่ไม่มีจุด

คำตอบ:


30

ทางเดียวกับ sed

sed '/\./!d' file
  • /\./จับคู่ตัวอักษรจุด (หนีด้วย\เพราะ.ตรงกับตัวละครใด ๆ )
  • !d ลบทุกอย่างยกเว้นรูปแบบที่ตรงกัน

หากคุณต้องการแก้ไขไฟล์ให้เพิ่ม-iไปยังคำสั่งหลังจากการทดสอบ (นอกจากนี้คุณยังสามารถเพิ่ม.bakการ-iตั้งค่าสถานะsed -i.bak ...เพื่อสร้างการสำรองข้อมูลภายในเครื่องของไฟล์ได้)

sed -i '/\./!d' file

26

คุณสามารถ grep ทุกอย่างด้วยจุดลงในไฟล์ใหม่:

grep "\."  file > newfile

ด้วยวิธีนี้คุณสามารถบันทึกไฟล์เก่าของคุณ



8

ฉันคิดว่าawkเป็นสิ่งสุดท้ายที่ขาดหายไปสำหรับงานเลี้ยง:

$ awk -F\. 'NF>1' file
com.blendtuts/S
com.blengineering.www/:http

ชุดตัวคั่นฟิลด์นี้เป็นจุด จากนั้นเป็นเรื่องของการพิมพ์บรรทัดเหล่านั้นที่มีอย่างน้อยสองฟิลด์: นี่จะหมายความว่าเกิดจุดอย่างน้อยหนึ่งจุด


3
วิธีแก้ปัญหา awk ที่ง่ายกว่าคือทำในหลอดเลือดดำเดียวกันกับ grep: awk '/\./' file- นั่นคือเพื่อพิมพ์เฉพาะบรรทัดที่มีอักขระ '.'
Chris Midgley

@ChrisMidgley ดีคนหนึ่ง! ตั้งแต่นี้เป็นสิ่งที่คำตอบมีgrepอยู่แล้วแนะนำฉันต้องการที่จะไปกับบางawkสิ่ง -specific :)
fedorqui


6

คุณสามารถทำได้ง่าย ๆ ด้วยเสียงเรียกเข้า หากคุณพอใจที่จะใช้ vim เป็นตัวแก้ไขข้อความ (การเปิดการแก้ไขและการเขียนไฟล์) ให้ทำดังนี้:

:g!/\./d

หากคุณไม่สะดวกในการใช้ vim หรือคุณต้องการใช้เป็นเครื่องมือบรรทัดคำสั่งคุณสามารถทำได้จากเทอร์มินัล:

vim file -c "g!/\./d" -c "wq"

คุณสามารถแก้ไขสิ่งนี้เล็กน้อยเพื่อบันทึกเป็นไฟล์ใหม่:

vim file -c "g!/\./d" -c "w newfile" -c "q!"

สิ่งนี้ใช้คำสั่ง "global" ของ vim ซึ่งใช้คำสั่ง ex กับทุกการจับคู่บรรทัด (หรือไม่จับคู่) regex ในกรณีนี้คำสั่งคือ "(d) elete" และจะใช้กับทุกคำสั่งที่ไม่ตรงกับ regex\.

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