Відповідь 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/ є стандартним синтаксисом заміни.
.* відповідатиме будь-чому до кінця поточного рядка.