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

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

  • Как извлечь строки, начинающиеся с шаблона и фрагментов между двумя шаблонами?
  • sed: совпадение двух строк
  • Проверка формата имени файла в оболочке linux
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Замените все цифры номера социального страхования (SSN) на X
  • почему этот простой скрипт sed не работал »nginx -V 2> & 1 | sed -r 's / - / \\ n / g' "
  • Bash найти и заменить в файле C ++
  • Заменяйте каждую вкладку ТОЛЬКО в начале каждой строки пробелами
  • 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 сохранить и закрыть

    Interesting Posts

    Как диагностировать проблемы отображения в Linux?

    Нажатие `up`, чтобы получить предыдущую команду в tty на сервере Ubuntu

    Использование rsync для перемещения (не копирования) файлов между каталогами?

    Есть ли разница между e2fsck и e4fsck в системах CentOS / RHEL?

    получить первое появление целого в текстовом файле

    start-stop-daemon работает не так, как ожидалось, файл pid не был написан

    Можно ли узнать, сколько места и времени занимает установка какого-либо приложения из источника?

    Глобальный поиск Vim в проекте

    Как найти IP-адрес виртуальной машины KVM из хост-системы?

    Случайное изображение кнопки SSH изменилось при настройке

    Как изменить содержимое строки на терминале, а не писать новую?

    Ubuntu 16.04 работает в режиме низкой графики

    Если оболочка запускает программу, будет ли оболочка также получать сигнал SIGINT при нажатии Ctrl + C?

    Возможно ли разделение экрана?

    Переадресация переменной bash в netcat

    Linux и Unix - лучшая ОС в мире.