2016-11-17 4 views
1

У меня есть большой файл .sql размером ~ 220 МБ.Grep/Sed заменить небольшой текст в большом файле .sql

Теперь в том, что у меня есть TRIGGER заявление, в этом файле, который использует другого пользователя, чем пользователю базы данных MySQL, я пытаюсь импортировать базу данных, так что это дает ниже сообщение об ошибке при попытке импорта базы данных:

ERROR 1142 (42000) at line 9732: TRIGGER command denied to user 'user_name'@'localhost' for table 'sales_flat_creditmemo' 

Теперь, как я могу найти все строки, содержащие инструкции TRIGGER, и изменить «user_name» на пользователя mysql «username_actual» во всем файле, даже не открыв его. Открытие этого файла в Geany также приводит к сбою Geany.

+0

Можете ли вы показать нам свою попытку решить эту проблему самостоятельно, или вы просто ищете бесплатную Раздаточные? – ghoti

ответ

1

Вы можете использовать комбинацию из grep и sed для замены на месте, фактически не открывая файл.

grep -Iril 'TRIGGER' sql_file | xargs sed -i 's/user_name/username_actual/g' 

Целями флагов являются: -

-I -> игнорировать двоичные файлы, делая grep на файлах. (Не может быть применимы здесь) -r -> рекурсивного поиска по всем подуровням каталогов -i -> Игнорировать регистр (регистр символов поиск) -l -> Просто напечатать имя-файл, в котором найдено соответствие.

Подробнее на странице man grep.

Существует также один классный альтернативный способ использования Vim в режиме Ex для выполнения замены на месте.

ex -sc '/TRIGGER/s/user_name/username_actual/|x' file 

Также последнее решение с использованием sed в покое в месте замены

sed -i '/TRIGGER/s/user_name/username_actual/g' 
+0

Спасибо, это действительно решило мою проблему. –

+0

Можете ли вы объяснить параметры grep в своем ответе, что такое 'I'? –

+0

И если OP знает, какой файл содержит инструкции TRIGGER, зачем вообще беспокоиться о 'grep'? – ghoti

Смежные вопросы