У меня большой текстовый файл (471 615 строк). Его структура похожа на:
use TABLE1/*!*/
good code here
use mysql/*!*/
bad code here
use TABLE1/*!*/
good code here
use mysql/*!*/
...
...
Как удалить разделы "плохой код"? Конечно, я знаю, что это будет своего рода цикл с регулярным выражением, но как это сделать? Я уже использовал циклы bash для создания аналогичного файла из двоичных файлов журнала mysql и вырезал некоторый контент с помощью sed на основе их номеров строк, но в этом файле слишком много случаев, чтобы вырезать их по номерам строк.
PS . Я только что сделал это вручную в течение 1 месяца, и есть 23 случая «плохого кода». Нужно исправить 6 месяцев, так что приблизительно 130-140 случаев. Как вы видите, мне пришлось бы потратить целый день, чтобы выкорчевать их вручную
5 ответов
Я попробовал решения RomanPerekhres и Raman Sailopal. Сначала вырезали слишком много (некоторые заголовки в начале файла. Вторые отлично справились, но оставили некоторые случаи. Я не пытался анализировать почему, а просто изменил стратегию. Я просто вырезал каждую строку с некоторыми конкретными словами, такими как GRANT TO, FUNCTION, CREATE USER, DROP USER, PRIVILEGES и т. Д. (С помощью sed offcourse). Таким образом я вырезал все команды, связанные с таблицей mysql.
Спасибо всем за вашу помощь в любом случае.
Простой awk :
Пример файла testfile
:
use TABLE1/*!*/
select user_id
from
system_users
use mysql/*!*/
drop database
delete * from users
delete id from system_users
use TABLE1/*!*/
select
sum(price)
from
orders
use mysql/*!*/
update users
set id = "bad boy"
drop table users
Работа:
awk '/^use TABLE/{ f=1 }/^use mysql/{ print; f=0 }f' testfile
Выход:
use TABLE1/*!*/
select user_id
from
system_users
use mysql/*!*/
use TABLE1/*!*/
select
sum(price)
from
orders
use mysql/*!*/
Это может работать для вас (GNU sed):
sed '/^use/h;G;/^use mysql/M!P;d' file
Добавьте оператор use
к каждой строке и напечатайте только те строки, которые не содержат use mysql
в добавленной части.
Другой седский подход
sed '/use mysql\/*!*\//,/use TABLE1\/*!*\//{//!d}' filename
Ищите все между использованием mysql ... и использованием TABLE1 ... затем удалите все, кроме строк, содержащих шаблоны поиска.
Sed для s/old/new/
, вот и все. Вы не делаете s/old/new/
, поэтому вам не следует рассматривать использование sed. Просто используйте awk:
$ awk '/^use mysql/{f=1} /^use TABLE1/{f=0} !f' file
use TABLE1/*!*/
good code here
use TABLE1/*!*/
good code here
Если вам нравится гольф, вы можете уменьшить это до:
$ awk '/^use/{f=/mysql/}!f' file
use TABLE1/*!*/
good code here
use TABLE1/*!*/
good code here
Новые вопросы
mysql
MySQL - это бесплатная система управления реляционными базами данных с открытым исходным кодом (RDBMS), использующая язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. Д. Это разные БД, которые все используют свои собственные диалекты SQL для управления данными.