Ich habe eine Datei voller Text wie:
CREATE TABLE `wild_adventure_game` (
`game_instance_id` bigint(20) unsigned NOT NULL,
`free_game_config_id` bigint(20) unsigned DEFAULT NULL,
`respin_instance_id` bigint(20) DEFAULT NULL,
`state` varchar(20) NOT NULL,
`stake` decimal(11,2) NOT NULL,
`pay_line_win` decimal(11,2) NOT NULL,
`bonus_win` decimal(11,2) NOT NULL,
`total_win` decimal(11,2) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Manchmal steht am Ende einer Zeile, die enthält ENGINE
, ein Komma, manchmal nicht. Ich möchte dieses Komma ersetzen (also löschen) – mein erster, naiver Versuch sah etwa so aus:
sed -e 's/'$) ENGINE/$) ENGINE/' < the_file
Das hat natürlich nicht funktioniert, aber ist es möglich, es sed
so hinzukriegen, dass es doch geht? Oder wenn nicht, vielleicht awk
? Im schlimmsten Fall kann ich ein Bash-Skript schreiben, aber das wird ziemlich umständlich.
Bearbeiten
Ich sehe, dass mir oben ein Tippfehler unterlaufen ist. Es hätte heißen müssen:
sed -e 's/,$) ENGINE/$) ENGINE/' < the_file
Im Beispiel möchte ich also das Komma am Ende der vorletzten Zeile durch nichts ersetzen oder allgemeiner einfach eine Teilzeichenfolge am Ende der letzten Zeile vor einer Zeile ersetzen, die einem Ausdruck entspricht. Bei meinem fehlgeschlagenen Versuch mit habe sed
ich verwendet, $
um das Ende einer Zeile darzustellen, und ich wusste eigentlich schon, dass das nicht funktionieren konnte, weil sed Zeilen einzeln liest, nicht über Zeilenenden hinweg; aber es veranschaulicht, was ich erreichen möchte – und das ist mit möglicherweise nicht möglich sed
.
Antwort1
Wie wäre es mit
sed '/ENGINE/ s/,$//' file
Für jede Zeile, dieenthält„ENGINE“, löschen Sie ein Komma am Zeilenende.
Antwort2
Eine awk-Lösung
/^) ENGINE/ {
sub( /,$/, "" )
print
next
}
{
print
}