Tìm và xóa các dòng từ tất cả các tệp đệ quy


14

Tôi đã quản lý để grep sự xuất hiện của một từ khóa bằng cách sử dụng

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

nhưng, số lần xuất hiện của KeyWord quá lớn. Tôi chỉ muốn xóa tất cả các dòng có chứa từ đó.

Tôi tìm kiếm xung quanh, sed trông giống như tiện ích. Bất cứ ai có thể cho tôi biết lệnh nào sẽ làm thủ thuật?

Cảm ơn.

Câu trả lời:


25

Với một sed GNU:

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

Với một chiếc OSX sed:

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

Lệnh đầu tiên findtìm thấy tất cả các tệp tiêu chuẩn (không phải thư mục hoặc đường ống, v.v.), in chúng cách nhau bởi \0(vì vậy tên tệp có thể chứa dấu cách, dòng mới, v.v.).

Lệnh thứ hai xargsđọc đầu ra của find, lấy một danh sách dựa trên dấu phân cách ( \0-0), gọi sed -i [...]các tham số được thêm vào từ danh sách ( sedsẽ được gọi nhiều lần nếu có nhiều tệp, vì độ dài tối đa của các tham số bị giới hạn trong từng lời cầu khẩn).

Các sedSửa lệnh tại chỗ ( -i).

Theo /KeyWord/dđó, nó sẽ xóa các dòng chứa biểu thức chính quy KeyWord.

Bạn nên học sedcách hiểu đúng cú pháp (đơn giản nhưng khác thường) và tham khảo các trang hướng dẫn phù hợp để biết thêm thông tin về các công cụ liên quan ở đây.


Và như tôi muốn quảng bá zsh, giải pháp với những khoảng trống mở rộng của nó:

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

Làm thế nào về việc chỉ cần xóa từ "từ khóa." và không phải toàn bộ dòng?
SurenNihalani

s/KeyWord//g(thay thế KeyWordbằng '' (chuỗi trống), gcho tất cả (không chỉ đầu tiên trên mỗi dòng).
Pierre Carrier

1

Bạn có thể sử dụng Vim trong chế độ Ex:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g tìm kiếm toàn cầu

  2. d xóa bỏ

  3. x lưu và đóng


trong OSX đã cho tôi find: illegal option -- t, đã phải thêm. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.