2017-10-18 87 views
-1

私はいくつかの文字列を変更して削除するためにskipを作っていますが、今度は "InnoDB DEFAULT"という単語を ")"に変更する必要があります。Grep + sedの組み合わせ

スクリプト: "最初に、私たちは、できるだけを表示するには、ファイルをはがします"

#! /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` 

問題がpelar5に

eliminacion=`rm p5 p4 p3 p2` 

var1='' 
var2='' 
count=0 

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

荒い翻訳したものです

私は開始時に与え
$pelar1 
$pelar2 
$pelar3 
$pelar4 

foo.sql

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

希望コード:

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

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

こと、その出力:pelarを割り当てる

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

サンプル入力と期待される出力を表示することはどうですか? –

+0

空白行を出力から冗長に削除する 'grep -v'行で達成しようとしていたことを説明できますか? –

答えて

0

すべて、これらのステートメント[1- 5]は出力をリダイレクトしているので、変数には何も入れられず、空の文字列として実行されます。どうして?

pelar1=`grep -v "LOCK TABLES" $ub1 | sed -e '/^$/d' > p5` 

これは、出力のための文字列"LOCK TABLES"を持っていない$ub1のすべての行を選択し、空白であることいずれかを削除sedを介してそれらを送信します。私はすべてのLOCK TABLE文が単一行にあると仮定しているので、P5にはLOCK TABLE文も空白行もありません。

このコマンドの出力はすべてp5にリダイレクトされるため、$pelar1には何も割り当てられません。 (P5がカウントダウンのように「剥離5」を意味する場合、「pelar1は」カウントアップされている間、私は、また、興味があります。一貫性を持たせてください。)このステートメントは、説明との任意の行を含め、コメント行を排除することを意図しているようだ

pelar2=`grep -v "[--]" p5 | sed -e '/^$/d' > p4` 

有効なステートメントの後にコメントします。私は、あなたが保つことを望んでいた人がいなかったはずであることを知っていると思います。また、sed - 空白行を再度入力しますが、すでにP5に空白行はありません。ここでも、出力はP4にリダイレクトされるため、$pelar2には何も割り当てられません。

しかし、私が読んだとおり、あなたはgrepという文字クラスを渡しています。これは実際にコメントを削除するだけでなく、ANY行のとのいずれかで、いずれもダッシュになります。おそらく意図されたものではないでしょう。

pelar3=`grep -v "[/*!]" p4 | sed -e '/^$/d' > p3` 

これは、おそらくコメントの先頭で行を削除することを意味します。これは、コメントが行間にまたがっていないことを前提としています。また、保持することを意図したコードの行にこの構文を使用する短いコメントはありません。存在しない空白行を再度削除し、$pelar3に何も返しません。

ただし、文字クラスも使用するため、スラッシュ、アスタリスク、または感嘆符を含む行はすべて削除されます。

pelar4=`grep -v "DROP TABLE IF EXISTS" p3 | sed -e '/^$/d' > p2` 

これにより、DROP TABLE文が削除されます。再び、存在しない空白行を削除し、varに何も返しません。

pelar5=`grep -v "ENGINE=InnoDB DEFAULT" p2 | sed -e "/^$/s/" > limpio` 

これは不完全sed置換のパイプと、InnoDBの行を削除します。 私のテスト -

> sed -e "/^$/s/"<x 
> sed: -e expression #1, char 6: unterminated `s' command 

エラーはありませんでしたか?

は、要約すると - そのようなコマンドは行をまたがらないこととして、コメント開始、書き換えで行を削除しても安全であるという仮定を維持:

これは作成せずに同じ一般的なことを行うべき
egrep -v '^$|/*!|--|LOCK TABLES|DROP TABLE IF EXISTS' foo1.sql | 
    sed 's/) *ENGINE=InnoDB *DEFAULT *CHARSET=latin1 *;/);/' >foo2.sql 

中間の一時ファイル。

これが何らかの形で否定的である場合は謝罪してください。私はそれが助けて欲しい

これらの前提が、あなたが意図したものであることを確認してください。

[UPDATE]

私は起動した場合 - それは私

CREATE TABLE `tabla` (
    'colmn1' varchar(20) DEFAULT NULL, 
    'colmn2' varchar(20) DEFAULT NULL 
); 
INSERT INTO `tabla` VALUES ('13','20'); 

のために生成

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

はあなたが求めていないものをということですか? (明示的にgrep -v "DROP TABLE IF EXISTS" p3 ...)

+0

他の方法はありませんか?これらの行は、言語が異なると考えています –

+0

ああ。私にいくつかのexmplesを与えて、多分あなたのOPを詳述してください。私たちは何が思いつくのかを見ていきます。 –

+0

スクリプトをparchingして、その.sqlをtxtの簡単なサンプルに変換します –