Відповідь AWK
Для вашого зразкового тексту у файлі з іменем sql
такий малюнок (з розривами рядків та відступом для наочності):
awk -v skip=1 '{
if (skip) { skip=0 }
else {
if (/FULLTEXT KEY/) { skip=1; sub(/,$/, "", prevline) }
print prevline
}
prevline=$0
}
END { print prevline }' sql
виробляє:
CREATE TABLE `table` (
`id` int(10) NOT NULL auto_increment,
`name` varchar(100) NOT NULL default '',
`description` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
Пояснення:
- Ми реалізуємо "lookahead", друкуючи раніше зустрічається рядок під час кожної ітерації, після огляду поточного рядка.
- Якщо поточний рядок містить
FULLTEXT KEY
маркер, ми встановлюємо прапор, щоб пропустити друк цього рядка під час наступної ітерації. Ми також видаляємо коду в кінці з попереднього рядка, який збирається надрукувати.
- Ми пропускаємо друк порожнього початкового рядка (раніше
prevline
він був встановлений), спочатку встановивши skip
на 1
("вірно").
- Ми обов'язково друкуємо останній рядок, закінчуючи сценарій додатковим
prevline
друком. Зауважимо, що поточна реалізація передбачає, що цей останній рядок не є лінією, що загрожує пропуском, тобто він не містить FULLTEXT KEY
маркера.
Оригінальна (неповна) sed
відповідь
Ця відповідь є неповною і, безумовно, у більшості випадків помилковою, оскільки sed
буде витрачати вхідний потік занадто швидко для запланованого результату, коли робити багаторядкові зіставлення - як зазначено в коментарях, він буде працювати лише для збігів у парних рядках! sed
не має "справжнього" функціонального пошуку, тому нам краще використовувати Python / Perl / тощо., або AWK, як вище.
Зразковий текст у файлі з іменем sql
має такий малюнок:
$ sed 'N; s/,\n FULLTEXT.*//' sql
виробляє:
CREATE TABLE `table` (
`id` int(10) NOT NULL auto_increment,
`name` varchar(100) NOT NULL default '',
`description` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
Пояснення:
N
дозволяє збігати міжряддя
\n
являє собою розрив лінії.
s/pattern/replacement/
є стандартним синтаксисом заміни.
.*
відповідатиме будь-чому до кінця поточного рядка.