У меня есть очень большой файл sql, который я не могу открыть в графическом редакторе. Мне нужно заменить строку 'user1' @ 'localhost' (обратите внимание на `символ) на 'user2' @ 'localhost', но у меня возникают проблемы с поиском правильного синтаксиса для команды sed.
Я могу получить строки для правильной замены, используя следующую команду grep:
grep -w 'user1`@`localhost'
Любая помощь, пожалуйста? Спасибо.
Я подумал о более общем решении, чем тот, о котором просит ваш вопрос.
Давайте представим, что вам нужно найти строку на основе ваших критериев поиска по регулярному выражению. Вы хотели бы заменить только его часть и оставить остальные соответствующие части без изменений.
Для демонстрации на примере:
echo "'some-name'@'some-host'" | sed -r "s/(')([^']+)('@'[^']*')/\1user2\3/g"
отобразит:
'user2'@'some-host'
Команда sed
выполняет замену с использованием синтаксиса s/search-regexp/replacement/g
. В нашем случае:
(')
соответствует первой одинарной кавычке. Это тривиально, но может быть более сложным. Он представляет часть строки перед заменой. sed
присваивает значение этого подвыражения специальной переменной \1
. ([^']+)
соответствует имени пользователя. В основном любой символ, начинающийся с предыдущей позиции, который не является кавычкой. sed
присваивает значение этого подвыражения специальной переменной \2
. ('@'[^']*')
соответствует части '@'host-name'
. Аналогично предыдущему подвыражению: цитата, снова @
, снова цитата и любой символ, который не является кавычкой, а затем кавычка в конце. sed
присваивает значение этого подвыражения специальной переменной \3
. Запасная часть заменит все, что соответствует регулярному выражению поиска. Используя переменные, показанные выше, мы можем заменить имя пользователя и оставить другие регионы нетронутыми. \1
+ ваше новое имя пользователя + \3
даст желаемый результат. Таким образом:
\1user2\3
Результат:
\2
намеренно не используется, поскольку мы заменяем имя пользователя) '@
и имя хоста в кавычках) . [тысяча сто двадцать восемь] Если вы cat
запустили свой файл сценария и направили его в команду sed
, вы должны получить желаемый результат.
Обернуть вашу команду sed вокруг речевых меток будет работать:
adder@adamj-T1500:~$ cat sed_test user1'@'localhost adder@adamj-T1500:~$ sed -i -e "s/user1'@'localhost/user2'@'localhost/" sed_test adder@adamj-T1500:~$ cat sed_test user2'@'localhost
Существует несколько различных способов избежать одиночной кавычки для команды sed
, есть несколько вопросов с ответами на stackoverflow:
https://stackoverflow.com/questions/9112157/escaping-single-quotes
https://stackoverflow.com/questions/7990750/ escape-single-quote
https://stackoverflow.com/questions/7517632/how-do-i-escape-double-and-single-quotes-in-sed-bash