Intereting Posts
Разница между разбиением слов до разложений и разбиением слов при разложениях в bash? Можно ли использовать «.» Для запуска файлов вместо источника в .bashrc в Ubuntu и OS X? Предложения, необходимые для udev, udisks, autofs, настройки уведомлений для полного автомонтирования в Linux Генерировать прерывания для целей стресс-тестирования Как совместить суффикс имени файла shell howto: сохранить несколько файлов двоичных данных (jpg) в один файл с некоторыми дополнительными данными и снова отделить Где определение struct task_struct в ядре Linux 2.6.30.5? Debian 6.0 и Intel «Sandy Bridge» (DH67CL) интегрировали видео Что делает ТАБ (ничего не набирается) изменение имени некоторых файлов навалом Отключение xscreensaver, когда firefox воспроизводит видео HTM5 Невозможно использовать GSM и GPRS с 3G-USB-ключом на BeagleBone Black одновременно Инструмент для экранирования всех кавычек в строке / файле Отслеживание взлома системы RHEL Замещать содержимое папки без включения самой папки

Замена параметров mysql с помощью sed

Я создаю резервный веб-сервер, но я хочу, чтобы на сервере резервного копирования был только один пользователь root. Поэтому после перемещения всех баз данных мне нужно заменить все mysqli_connect(...) в db.txt .

Я написал:

 beg="mysqli_connect(" end=");" #need to find out the database db="123" new="'localhost','root','pass','$db'" cat db.txt | sed "s/$beg.*$end/$beg$new$end/" 

для замены всех конфигов, но мне нужно узнать базу данных. Я могу сделать это, получив текст между $end и предыдущим ' , ', но как бы я мог получить это с sed?


вход:

Потенциальный файл:

 sadnkjnadsjknfaskdjfnlasdnfkdsa safdjnasdkjjfasndka asfdknjdsakjfnasjdnkfsadnjkads mysqli_connect("192.168.1.10","dave","password","DavesDB"); sdfnjnweewrewqrfgjdgnf vncnccnvxjncvjn4wrwerewrewerwjvcnxjnvcj mysqli_connect("192.168.1.10" , "tom" , "password" , 'TomsDB'); dsanjasdknfjansd sakfdnjsadjkfnsa sknfdsjdnfjsdnnqwerweq 

вывод:

 sadnkjnadsjknfaskdjfnlasdnfkdsa safdjnasdkjjfasndka asfdknjdsakjfnasjdnkfsadnjkads mysqli_connect("localhost","root","rootpassword","DavesDB"); sdfnjnweewrewqrfgjdgnf vncnccnvxjncvjn4wrwerewrewerwjvcnxjnvcj mysqli_connect("localhost","root","rootpassword","TomsDB"); dsanjasdknfjansd sakfdnjsadjkfnsa sknfdsjdnfjsdnnqwerweq 

Вам не нужно получать имя базы данных, нет смысла заменять что-то самим. Просто оставьте это без изменений:

 beg="mysqli_connect(" new="'localhost','root','pass'," sed "s/$beg\([^,]\+,\)\{3\}/$beg$new/" file 

Если я сохраню пример, который вы указали как file , который возвращает:

 $ sed "s/$beg\([^,]\+,\)\{3\}/$beg$new/" file sadnkjnadsjknfaskdjfnlasdnfkdsa safdjnasdkjjfasndka asfdknjdsakjfnasjdnkfsadnjkads mysqli_connect('localhost','root','pass',"DavesDB"); sdfnjnweewrewqrfgjdgnf vncnccnvxjncvjn4wrwerewrewerwjvcnxjnvcj mysqli_connect('localhost','root','pass', 'TomsDB'); dsanjasdknfjansd sakfdnjsadjkfnsa sknfdsjdnfjsdnnqwerweq 

Регулярное выражение sed ищет $beg , затем три экземпляра non , за которым следует запятая ( \([^,]\+,\)\{3\} ) и заменяет их $beg$new . Имя БД осталось как есть, так как нет причин для его изменения.

Вы также можете немного упростить синтаксис, удалив ( из $beg который позволяет использовать расширенный синтаксис regex sed:

 $ sed -E "s/$beg\(([^,]+,){3}/$beg($new/" file sadnkjnadsjknfaskdjfnlasdnfkdsa safdjnasdkjjfasndka asfdknjdsakjfnasjdnkfsadnjkads mysqli_connect('localhost','root','pass',"DavesDB"); sdfnjnweewrewqrfgjdgnf vncnccnvxjncvjn4wrwerewrewerwjvcnxjnvcj mysqli_connect('localhost','root','pass', 'TomsDB'); dsanjasdknfjansd sakfdnjsadjkfnsa sknfdsjdnfjsdnnqwerweq