12

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

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

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

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

Благодарю.

2 ответа2

23

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

Вы можете использовать Vim в режиме Ex:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g глобальный поиск

  2. d удалить

  3. x сохранить и закрыть

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .