Команда sed заменяет текст на символ

У меня есть очень большой файл sql, который я не могу открыть в графическом редакторе. Мне нужно заменить строку 'user1' @ 'localhost' (обратите внимание на `символ) на 'user2' @ 'localhost', но у меня возникают проблемы с поиском правильного синтаксиса для команды sed.

Я могу получить строки для правильной замены, используя следующую команду grep:

grep -w 'user1`@`localhost'

Любая помощь, пожалуйста? Спасибо.

1
задан 24 January 2014 в 20:00

2 ответа

Я подумал о более общем решении, чем тот, о котором просит ваш вопрос.

Давайте представим, что вам нужно найти строку на основе ваших критериев поиска по регулярному выражению. Вы хотели бы заменить только его часть и оставить остальные соответствующие части без изменений.

Для демонстрации на примере:

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

Результат:

  • Каким бы ни было содержимое первого подвыражения (это одиночная кавычка)
  • , за которым следует строка " user2 ", (примечание \2 намеренно не используется, поскольку мы заменяем имя пользователя)
  • и, наконец, содержимое 3-го подвыражения (которое представляет собой '@ и имя хоста в кавычках) . [тысяча сто двадцать восемь]

Если вы cat запустили свой файл сценария и направили его в команду sed, вы должны получить желаемый результат.

0
ответ дан 24 January 2014 в 20:00

Обернуть вашу команду 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

0
ответ дан 24 January 2014 в 20:00

Другие вопросы по тегам:

Похожие вопросы: