У меня большой текстовый файл (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 случаев. Как вы видите, мне пришлось бы потратить целый день, чтобы выкорчевать их вручную

0
180doman 1 Сен 2017 в 11:05

5 ответов

Лучший ответ

Я попробовал решения RomanPerekhres и Raman Sailopal. Сначала вырезали слишком много (некоторые заголовки в начале файла. Вторые отлично справились, но оставили некоторые случаи. Я не пытался анализировать почему, а просто изменил стратегию. Я просто вырезал каждую строку с некоторыми конкретными словами, такими как GRANT TO, FUNCTION, CREATE USER, DROP USER, PRIVILEGES и т. Д. (С помощью sed offcourse). Таким образом я вырезал все команды, связанные с таблицей mysql.

Спасибо всем за вашу помощь в любом случае.

0
180doman 4 Сен 2017 в 07:18

Простой 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/*!*/
1
RomanPerekhrest 1 Сен 2017 в 08:49

Это может работать для вас (GNU sed):

sed '/^use/h;G;/^use mysql/M!P;d' file

Добавьте оператор use к каждой строке и напечатайте только те строки, которые не содержат use mysql в добавленной части.

0
potong 1 Сен 2017 в 08:51

Другой седский подход

sed '/use mysql\/*!*\//,/use TABLE1\/*!*\//{//!d}' filename

Ищите все между использованием mysql ... и использованием TABLE1 ... затем удалите все, кроме строк, содержащих шаблоны поиска.

0
Raman Sailopal 1 Сен 2017 в 10:40

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
0
Ed Morton 2 Сен 2017 в 14:21