Поиск и удаление строк из всех файлов рекурсивно


14

Мне удалось найти вхождения ключевого слова, используя

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

но вхождения KeyWord слишком велики. Я просто хочу удалить все строки, содержащие это слово.

Я искал вокруг, sed выглядит как утилита. Может кто-нибудь сказать мне, какая команда будет добиваться цели?

Благодарю.

Ответы:


25

С GNU sed:

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 **/*(.)

Как насчет просто удалить слово «ключевое слово». а не вся линия?
Сурен Нихалани

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 {} ';'
Erik
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.