การค้นหาและลบบรรทัดจากไฟล์ทั้งหมดแบบเรียกซ้ำ


14

ฉันจัดการเพื่อ grep ที่เกิดขึ้นของคำหลักโดยใช้

grep "KeyWord" . -r -n -i -I 

แต่การเกิดขึ้นของ KeyWord นั้นใหญ่เกินไป ฉันแค่ต้องการลบบรรทัดทั้งหมดที่มีคำนั้น

ฉันค้นหาไปรอบ ๆ sed ดูเหมือนจะเป็นอรรถประโยชน์ ใครสามารถบอกฉันว่าคำสั่งจะทำเคล็ดลับหรือไม่

ขอบคุณ

คำตอบ:


25

ด้วยความช่วยเหลือของ GNU:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

ด้วย OSX sed:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

คำสั่งแรกfindค้นหาไฟล์มาตรฐานทั้งหมด (ไม่ใช่ไดเร็กทอรีหรือไพพ์หรืออื่น ๆ ) พิมพ์โดยคั่นด้วย\0(ดังนั้นชื่อไฟล์สามารถมีช่องว่างบรรทัดใหม่ ฯลฯ )

คำสั่งที่สองxargsอ่านเอาต์พุตของfind, คว้ารายการตามตัวคั่น ( \0เนื่องจาก-0), เรียกใช้sed -i [...]ด้วยพารามิเตอร์ที่เพิ่มจากรายการ ( sedจะถูกเรียกหลายครั้งถ้ามีไฟล์จำนวนมากเนื่องจากความยาวสูงสุดของพารามิเตอร์ถูก จำกัด แต่ละคำขอร้อง)

sedปรับเปลี่ยนคำสั่งในสถานที่ ( -i)

ในฐานะที่เป็นมันจะลบบรรทัดที่มีการแสดงออกปกติ/KeyWord/dKeyWord

คุณควรเรียนรู้ที่sedจะเข้าใจไวยากรณ์ (เรียบง่าย แต่ผิดปกติ) และอ้างอิงไปยัง manpages ที่เหมาะสมสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือที่เกี่ยวข้องที่นี่


และในขณะที่ฉันต้องการส่งเสริมzshวิธีการแก้ปัญหาด้วย globs ขยายของมัน:

sed -i /KeyWord/d **/*(.)

วิธีเพียงแค่การลบคำว่า "คำหลัก" ไม่ใช่เส้นทั้งหมดหรือ
SurenNihalani

s/KeyWord//g(ทดแทนKeyWordด้วย '' (สตริงว่าง) gสำหรับทั้งหมด (ไม่เพียงบรรทัดแรกในแต่ละบรรทัด)
Pierre Carrier

1

คุณสามารถใช้ Vim ในโหมด Ex:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g ค้นหาทั่วโลก

  2. d ลบ

  3. x บันทึกและปิด


ใน OSX ที่ให้ฉันfind: illegal option -- tต้องเพิ่ม. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.