我正在改变并从sql中删除一些字符串,现在我需要更改单词“InnoDB DEFAULT”以获得“)”¿任何帮助?
脚本:
#! /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');
它的输出:
DROP TABLE IF EXISTS `tabla`;
CREATE TABLE `tabla` (
`colmn1` varchar(20) DEFAULT NULL,
`colmn2` varchar(20) DEFAULT NULL
INSERT INTO `tabla` VALUES ('13','20');
答案 0 :(得分:0)
所有分配pelar [1-5]的语句都是重定向输出,因此没有任何东西可能被放入变量中,然后作为空字符串执行。为什么?
pelar1=`grep -v "LOCK TABLES" $ub1 | sed -e '/^$/d' > p5`
这将选择输出所有没有字符串$ub1
的{{1}}行,并通过sed发送它们,删除任何空白的行。我假设所有LOCK TABLE语句都在单行上,所以现在P5既没有LOCK TABLE语句也没有空行。
此命令的输出全部重定向到p5,因此没有任何内容分配给"LOCK TABLES"
。 (我也很好奇,如果p5意味着"剥离5"作为倒计时,而#34; pelar1"正在计数。保持一致。)
$pelar1
此声明似乎旨在消除注释行,包括在有效语句之后带有解释性注释的任何行。我猜你知道一定没有你想要留下的。它还pelar2=`grep -v "[--]" p5 | sed -e '/^$/d' > p4`
- 再次剥离空行,但是P5中没有,因为你已经这样做了。同样,它将输出重定向到P4,因此sed
中不会分配任何内容。
但是,当我读到它时,你正在传递$pelar2
一个字符类。这确实会删除评论,但也会删除任何行任何破折号。可能不是故意的。
grep
这可能意味着在评论的开头删除行。它假定注释不会跨越行,并且在你想要保留的代码行上使用这种语法不会有短评论,如果你知道永远不会发生这种情况就没问题。它再次删除不存在的空白行,并且不向pelar3=`grep -v "[/*!]" p4 | sed -e '/^$/d' > p3`
返回任何内容。
但是,它再次使用一个字符类,因此将删除带有任何正斜杠,星号或感叹号的任何行。
$pelar3
这消除了pelar4=`grep -v "DROP TABLE IF EXISTS" p3 | sed -e '/^$/d' > p2`
个陈述;再次,删除不存在的空白行,不向var返回任何内容。
DROP TABLE
这将删除InnoDB行,并使用不完整pelar5=`grep -v "ENGINE=InnoDB DEFAULT" p2 | sed -e "/^$/s/" > limpio`
替换的管道。
我的测试 -
sed
你没有收到错误吗?
总结 - 保持诸如命令之类的假设不跨越行并且删除带有注释的行是安全的,重写:
> sed -e "/^$/s/"<x
> sed: -e expression #1, char 6: unterminated `s' command
如果不创建中间临时文件,这应该做同样的事情。
道歉,如果这听起来有任何负面影响。我希望它有所帮助。
确保这些假设符合您的意图。
[UPDATE]
如果我从 -
开始egrep -v '^$|/*!|--|LOCK TABLES|DROP TABLE IF EXISTS' foo1.sql |
sed 's/) *ENGINE=InnoDB *DEFAULT *CHARSET=latin1 *;/);/' >foo2.sql
它为我生产
-- 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');
这不是你要求的吗?
(在pelar4中你明确地CREATE TABLE `tabla` (
'colmn1' varchar(20) DEFAULT NULL,
'colmn2' varchar(20) DEFAULT NULL
);
INSERT INTO `tabla` VALUES ('13','20');
...)