Eine awk-Lösung

Eine awk-Lösung

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 sedso 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 sedich 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
  }

verwandte Informationen