Знаходження та видалення рядків із усіх файлів рекурсивно


12

Мені вдалося визначити виникнення ключового слова за допомогою

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

але частота ключових слів занадто велика. Я просто хочу видалити всі рядки, що містять це слово.

Я обшукував, sed виглядає як утиліта. Хтось може сказати мені, яка команда зробить трюк?

Дякую.

Відповіді:


23

З sed 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/d, він видалить рядки, що містять регулярний вираз KeyWord.

Вам слід навчитися sedправильно розуміти (простий, але незвичний) синтаксис та звертатися до відповідних манджейдів для отримання додаткової інформації про інструменти, які тут містяться.


І як я люблю просувати zsh, рішення з розширеними сферами:

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

Як щодо просто видалення слова "ключове слово". а не вся лінія?
SurenNihalani

s/KeyWord//g(замінює KeyWordна '' (порожній рядок) gдля всіх (не тільки перших у кожному рядку).
П'єр Перевізник

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 {} ';'
Ерік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.