Удаление строк, содержащих указанную строку в разных файлах

Предположим, есть два файла в web/ named foo.php и bar.php . Первая строка foo.php – «sdajgeSTRINGdsad», а 10-я строка bar.php – «gdfhu98324STRING». Задача состоит в том, чтобы сначала найти эти два файла, а затем удалить 1-ю строку foo.php и 10-й строки bar.php, учитывая, что указанная строка является «STRING».

5 Solutions collect form web for “Удаление строк, содержащих указанную строку в разных файлах”

sed может сделать это:

 sed -i.bak '/STRING/d' web/* 

Чтобы найти файл, содержащий строку, используйте grep . Если вы хотите найти, какие файлы содержат STRING в web/ и во всех подкаталогах:

grep -R "STRING" web /

Чтобы отредактировать файл и удалить строки, содержащие строку, есть много вариантов, но здесь два общих. Поскольку вы хотите работать на целых линиях, это очень просто 🙂

Сначала вы можете использовать grep с аргументом -v чтобы отменить поиск и скрыть соответствующие строки из вывода, а не показывать их. Для вашего первого файла, давайте сделаем это, используя sponge . Это позволит нам читать ваш файл, фильтровать его, а затем записывать обратно в один и тот же файл одним движением:

 grep -v "sdajgeSTRINGdsad" foo.php | sponge foo.php 

Для вашего второго примера мы будем делать то же самое с grep , но если у вас нет sponge вы можете записать ее в другой файл, а затем перенести этот файл обратно на исходное имя:

 grep -v "gdfhu98324STRING" bar.php > bar.php.cleaned mv bar.php{.cleaned,} 

Второй способ – использовать sed с командой d line delete. В первом примере мы будем использовать редактирование файла на месте с возможностью создания .bk резервной копии .bk :

 sed -i.bk '/sdajgeSTRINGdsad/d' foo.php 

Практически то же самое можно было бы сделать, скопировав файл самостоятельно, затем используя sed, чтобы отфильтровать резервную копию и переписать оригинал:

 cp bar.php bar.php.bk sed '/gdfhu98324STRING/d' bar.php.bk > bar.php 

Теперь, чтобы объединить эти две задачи! Давайте сделаем функцию, чтобы вы могли делать это несколько раз с разными строками:

 function nuke_string () { string="$1" path="$2" grep -R -l "$string" "$path" | while IFS= read -r file; do sed -i.bk "/$string/d" "$file" done } 

Создав эту функцию, вы можете использовать ее так:

 nuke_string "STRING" web/ 

Любые файлы, содержащие STRING в сети /, будут удалены из этих строк и будет сделана резервная копия исходной версии. Вы можете создать такую ​​функцию в текущей оболочке, или вы можете записать ее в свой .bashrc файл и всегда иметь ее.

Просто используйте grep -l вместе с -R ! Вот полный однострочный слой:

 grep -Rl "STRING" web/ | xargs sed -i "/STRING/d" 

Существуют две альтернативы:

  1. используйте find для рекурсивного поиска ваших файлов (например, *.php файлов) и perl или GNU-вкуса sed (оба имеют параметр -i ) для выполнения удаления.

  2. То, что вы запрашиваете, выглядит как операция рефакторинга: измените имя элемента кода всюду в кодовой базе. Если мое предположение верно, вы должны проверить IDE, способные обрабатывать php .

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

 for k in web/*.php do ex -sc '/STRING/d|x' "$k" done 
  1. d удалить

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

  • Переименование файлов с номерами в соответствующие 1-n числа в порядке
  • Создание нескольких входных файлов с помощью sed в цикле for
  • Удалить строку с пробелами и цитатами из xml-файла
  • Как сделать замену sed (s /// g) на основе списка? Мне нужно поменять несколько слов, с другими соответствующими словами
  • нужно понимать использование «/» в команде sed
  • vi - заменить символы из части строки
  • как заменить значение на это значение + константа
  • sed в поиске сценариев bash
  • Удаление новых символов линии вокруг шаблонов
  • Изменить значение в таблице
  • Как извлечь одно значение из однострочных кортежей?
  • Как использовать sed, как заменить строку, содержащую шаблон, содержимым из другого файла?
  • Linux и Unix - лучшая ОС в мире.