Odpověď AWK
S vaším ukázkovým textem v souboru s názvem sql , následující vzor (se zalomením řádků a odsazením pro srozumitelnost):
awk -v skip=1 '{
if (skip) { skip=0 }
else {
if (/FULLTEXT KEY/) { skip=1; sub(/,$/, "", prevline) }
print prevline
}
prevline=$0
}
END { print prevline }' sql
produkuje:
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 */;
Vysvětlení:
- Implementujeme „lookahead“ tak, že vytiskneme pouze dříve nalezený řádek při každé iteraci, po kontrole aktuálního řádku.
- Pokud aktuální řádek obsahuje
FULLTEXT KEYnastavíme příznak pro přeskočení tisku tohoto řádku během další iterace. Odstraníme také koncovou čárku na předchozím řádku, který se chystá vytisknout. - Přeskočíme tisk prázdného počátečního řádku (před
prevlinebylo nastaveno) počátečním nastavenímskipaž1("pravda"). - Ujistíme se, že vytiskneme poslední řádek tak, že skript ukončíme znakem
prevlinetisk. Všimněte si, že současná implementace předpokládá, že tento poslední řádek nepředstavuje řádek, u kterého hrozí riziko přeskočení, tj. že neobsahujeFULLTEXT KEYznačka.
Originál (neúplný) sed odpověď
Tato odpověď je neúplná a určitě ve většině případů nesprávná, protože sed spotřebovává vstupní proud příliš rychle pro zamýšlený výsledek při provádění víceřádkového porovnávání - jak bylo uvedeno v komentářích, bude fungovat pouze pro shody na sudých řádcích! sed nemá "skutečnou" funkci dopředného vyhledávání, takže by bylo lepší použít Python/Perl/atd., nebo dokonce AWK, jak je uvedeno výše.
S vaším ukázkovým textem v souboru s názvem sql , následující vzor:
$ sed 'N; s/,\n FULLTEXT.*//' sql
produkuje:
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 */;
Vysvětlení:
Numožňuje víceřádkovou shodu.\npředstavuje zalomení řádku.s/pattern/replacement/je standardní náhradní syntaxe..*bude odpovídat čemukoli na konci aktuálního řádku.
Jak extrahovat a/nebo odstranit poslední stránku z hromady PDF?
Jak změnit název terminálu Terminator, ZSH na Debianu?