Linux SED AWK Sqlite dump to MySQL在以create table开头的行上将字符串更改为varchar

Linux SED AWK Sqlite dump to MySQL在以create table开头的行上将字符串更改为varchar,mysql,bash,sqlite,sed,awk,Mysql,Bash,Sqlite,Sed,Awk,我需要一个内联sed命令将“string”替换为“varchar(30)”,但是createtable语法可以是多行的 有没有办法告诉sed(或使用awk?)在不以“INSERT INTO…”开头的行上进行替换 “字符串”一词可能出现在我的数据中,我不希望数据损坏 sed -i 's/string/varchar(30)/g' 我知道基本的正则表达式,但这是我无法理解的。谢谢 sed -i '/^INSERT INTO/! s/string/varchar(30)/g' 从: 在地址(或地址

我需要一个内联sed命令将“string”替换为“varchar(30)”,但是createtable语法可以是多行的

有没有办法告诉sed(或使用awk?)在不以“INSERT INTO…”开头的行上进行替换

“字符串”一词可能出现在我的数据中,我不希望数据损坏

sed -i 's/string/varchar(30)/g'
我知道基本的正则表达式,但这是我无法理解的。谢谢

sed -i '/^INSERT INTO/! s/string/varchar(30)/g'
从:

在地址(或地址范围)之后,在命令之前,一个
,该代码规定,仅当地址(或地址范围)不匹配时,才应执行命令


你可以利用标签

使用gnu sed:

sed -i '/^INSERT INTO/b a; s/string/varchar(30)/g; :a' filename
否则

sed -i -e '/^INSERT INTO/b a' -e 's/string/varchar(30)/g' -e :a filename

你能解释一下/b是用来做什么的吗?
a
是一个标签<代码>b a
表示分支到标签
a
;如果匹配成功,它将分支。即使您已经接受了答案,我仍然建议向我们展示一些其他人可以轻松理解您的问题的示例输入文件。实际上,我最终放弃了将sqlite.dump转换为mysql语法的尝试。我现在将sqlite转换为csv,将csv转换为mysql。不需要SED或AWK。如果有人感兴趣的话,我可以展示代码,但我认为这与谷歌关于这个主题的#1线程更相关。我可以把它附加在那里作为替代方法。