2017-10-18 3 views
-1

Ich mache einen Tipp zu ändern und löschen Sie einige Zeichenfolge von sql, jetzt muss ich das Wort "InnoDB DEFAULT" für eine ")" ¿Jede Hilfe?Grep + sed Kombination

Script:

#! /bin/bash 
ub1=foo1.sql; 
ub2=''; 

pelar1=`grep -v "LOCK TABLES" $ub1 | sed -e '/^$/d' > p5` 
pelar2=`grep -v "[--]" p5 | sed -e '/^$/d' > p4` 
pelar3=`grep -v "[/*!]" p4 | sed -e '/^$/d' > p3` 
pelar4=`grep -v "DROP TABLE IF EXISTS" p3 | sed -e '/^$/d' > p2` 
pelar5=`grep -v "ENGINE=InnoDB DEFAULT" p2 | sed -e "/^$/s/" > limpio` 

das Problem auf pelar5

eliminacion=`rm p5 p4 p3 p2` 

var1='' 
var2='' 
count=0 

#primero vamos a pelar el archivo para que muestre lo menos posible 

Rohübersetzung: "Zuerst werden wir die Datei schälen so wenig wie möglich zu zeigen"

$pelar1 
$pelar2 
$pelar3 
$pelar4 

foo.sql, die ich am Anfang geben

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'); 

Wunsch Code:

DROP TABLE IF EXISTS `tabla`; 
    CREATE TABLE `tabla` (
     `colmn1` varchar(20) DEFAULT NULL, 
     `colmn2` varchar(20) DEFAULT NULL 
    ); 

INSERT INTO `tabla` VALUES ('13','20'); 

, dass seine die Ausgabe:

DROP TABLE IF EXISTS `tabla`; 
CREATE TABLE `tabla` (
    `colmn1` varchar(20) DEFAULT NULL, 
    `colmn2` varchar(20) DEFAULT NULL 
INSERT INTO `tabla` VALUES ('13','20'); 
+2

Wie wäre es mit Beispieleingabe und erwartete Ausgabe? –

+0

Können Sie erklären, was Sie mit diesen 'grep -v'-Zeilen erreichen wollten, die die leeren Zeilen redundant von ihrer Ausgabe entfernen? –

Antwort

0

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 ...)

+0

Gibt es keine andere Methode kombiniert?, Denke, dass diese Zeilen die Sprache –

+0

Ah variieren können. geben Sie mir ein paar Beispiele, vielleicht erarbeiten Sie Ihr OP. Wir werden sehen, was wir uns vorstellen können. –

+0

Imparching der Scrip, ist es für eine Umwandlung einer .SQL zu einem einfachen Beispiel von txt –

Verwandte Themen