diese Aussagen Alles, was pelar zuweisen [1- 5] leiten die Ausgabe um, sodass wahrscheinlich nichts in die Variablen eingefügt wird, die dann als leere Strings ausgeführt werden. Warum?
pelar1=`grep -v "LOCK TABLES" $ub1 | sed -e '/^$/d' > p5`
Dies wählt zur Ausgabe alle Zeilen, die die Zeichenfolge $ub1
"LOCK TABLES"
nicht haben, und sendet diese über einen Sed die jede löscht, die leer sind. Ich gehe davon aus, dass alle LOCK TABLE-Anweisungen auf einzelnen Zeilen stehen, so dass P5 jetzt weder LOCK TABLE-Anweisungen noch Leerzeilen enthält.
Die Ausgabe dieses Befehls wird alle auf p5 umgeleitet, daher ist $pelar1
nichts zugewiesen. (Ich bin auch gespannt, ob p5 bedeutet „peel 5“ als Countdown, während „pelar1“ zählt auf. Übereinstimmen.)
pelar2=`grep -v "[--]" p5 | sed -e '/^$/d' > p4`
Diese Aussage bestimmt scheint Kommentarzeilen zu beseitigen, einschließlich der Linie mit erläuternden Kommentare nach einer gültigen Aussage. Ich nehme an, Sie wissen, dass es keines von denen gab, die Sie behalten wollten. Es auch sed
-strips Leerzeilen wieder, aber es würde keine in P5 sein, da Sie das schon getan haben. Auch hier wird die Ausgabe an P4 umgeleitet, sodass in $pelar2
nichts zugewiesen wird.
Allerdings, wie ich es gelesen habe, übergeben Sie grep
eine Zeichenklasse. Dies wird in der Tat entfernen Sie Kommentare, sondern auch ANY Linie mit alle Strich drin überhaupt. Wahrscheinlich nicht was beabsichtigt war.
pelar3=`grep -v "[/*!]" p4 | sed -e '/^$/d' > p3`
Dies ist wahrscheinlich zum Entfernen von Zeilen mit dem Beginn eines Kommentars gemeint. Es geht davon aus, dass der Kommentar sich nicht über mehrere Zeilen erstrecken wird und dass es keine kurzen Kommentare geben wird, die diese Syntax in einer Zeile mit Code verwenden, den Sie behalten wollten. Das ist in Ordnung, wenn Sie wissen, dass das nie passieren wird. Es löscht erneut nicht vorhandene leere Zeilen und gibt nichts an $pelar3
zurück.
Es wird jedoch erneut eine Zeichenklasse verwendet. Daher wird jede Zeile mit einem Schrägstrich, Sternchen oder Ausrufezeichen entfernt.
pelar4=`grep -v "DROP TABLE IF EXISTS" p3 | sed -e '/^$/d' > p2`
Dies eliminiert DROP TABLE
Aussagen; entfernt erneut nicht vorhandene Leerzeilen und gibt nichts an die Variable zurück.
pelar5=`grep -v "ENGINE=InnoDB DEFAULT" p2 | sed -e "/^$/s/" > limpio`
Dies entfernt die InnoDB Linien, mit einem Rohr zu einer unvollständigen sed
Substitution. Mein Test -
> sed -e "/^$/s/"<x
> sed: -e expression #1, char 6: unterminated `s' command
Haben Sie einen Fehler nicht zu bekommen?
Um es zusammenzufassen - die Annahmen zu halten, wie die Befehle nicht Zeilen umfassen und dass es sicher ist, Linien mit Kommentaren beginnt zu entfernen, neu geschrieben:
egrep -v '^$|/*!|--|LOCK TABLES|DROP TABLE IF EXISTS' foo1.sql |
sed 's/) *ENGINE=InnoDB *DEFAULT *CHARSET=latin1 *;/);/' >foo2.sql
Dies sollte die gleiche allgemeine Sache tun, ohne die Schaffung temporäre temporäre Dateien.
Entschuldigung, wenn dies in irgendeiner Weise negativ klingt. Ich hoffe, es hilft.
Stellen Sie sicher, dass diese Annahmen Ihren Vorstellungen entsprechen.
[UPDATE]
Wenn ich mit Start -
-- single line comment
/*! preprocessor stuff */
LOCK TABLES and CHAIRS
DROP TABLE IF EXISTS `tabla`;
CREATE TABLE `tabla` (
'colmn1' varchar(20) DEFAULT NULL,
'colmn2' varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `tabla` VALUES ('13','20');
es für mich
CREATE TABLE `tabla` (
'colmn1' varchar(20) DEFAULT NULL,
'colmn2' varchar(20) DEFAULT NULL
);
INSERT INTO `tabla` VALUES ('13','20');
produziert Ist das nicht das, was Sie gefragt? (In Pelar4 Sie explizit grep -v "DROP TABLE IF EXISTS" p3
...)
Wie wäre es mit Beispieleingabe und erwartete Ausgabe? –
Können Sie erklären, was Sie mit diesen 'grep -v'-Zeilen erreichen wollten, die die leeren Zeilen redundant von ihrer Ausgabe entfernen? –