mysql - 将 sql 模式文件的 git diff 转换为应用/撤消 sql 脚本

标签 mysql sed text-processing git-diff string-substitution

我正在尝试制作一个简单的 bashscript,给定一个 sql 模式定义文件的 git diff 输出,将能够创建一个更新脚本和撤消脚本。所以有这样的输入:

 create table xxx
 (
-       aaa numeric(18) primary key,
-       bbb numeric(18) not null,
-       ccc numeric(18) not null,
+       aaa INT UNSIGNED AUTO_INCREMENT primary key,
+       AlarmId INT UNSIGNED not null,
+       ccc INT UNSIGNED not null,
        ddd smallint not null,
        eee varchar(2),
        fff varchar(2),
    )

假设我想制作一个更新脚本。我将所有 create 语句更改为 alter,然后删除所有不必要的行,最后用 change 语句替换“+”标记(它;s mysql 脚本)。我喜欢这样:

sed "s/^\s*create/ALTER/g" < $infile | sed "/^\s\|@/d" | sed "/^-/d" | sed "s/^+\s*\(\`\?\w\+\`\?\)/\tCHANGE \1 \1/g"

所以我终于得到了这样的东西:

ALTER table xxx
        CHANGE aaa aaa INT UNSIGNED AUTO_INCREMENT primary key,
        CHANGE bbb bbb INT UNSIGNED not null,
        CHANGE ccc ccc INT UNSIGNED not null,
        CHANGE ddd ddd smallint not null,
ALTER table yyy
        CHANGE aaa aaa INT UNSIGNED primary key,
        CHANGE bbb bbb smallint not null,
        CHANGE ccc ccc smallint not null,
        CHANGE ddd ddd INT UNSIGNED not null,
        CHANGE eee eee varchar(1024) not null
ALTER table zzz
(and so on)

我需要做的最后一件事是用冒号完成每个语句 - 我完全被困在那里。基本上,我需要找到每个 ALTER 语句(或 EOF),并在其上方的行末添加一个冒号(可能替换现有的逗号)。我能够使用它的 s 命令在 vim 中做到这一点:

%s/\(,\)\=\_s\+\(ALTER.*\|\%$\)/;\r\2

但我未能将其转换为 sed 语法。看来,强制 sed 接受多行模式是一项艰巨的工作。 所以 - 谁能告诉我该怎么做?我想 sed 不是唯一的选择。这只是我的第一选择(不是最好的选择 :) ) 也许有一些开箱即用的解决方案,而我只是在重新发明轮子?

最佳答案

有趣的方法(也很脆弱 - 想象一下将多个列放在同一行上的更改)。 Perl 可以帮助你处理分号:

 perl -0777 -pe 's/[,\s]+ALTER/;\nALTER/g;
                 s/$/;/' < input > output
  • -0777“吞噬”整个文件(而不是逐行读取)
  • -p 打印处理后读取的内容
  • [,\s]+ 匹配空格和逗号,必须至少有一个这样的字符(它防止在第一个 ALTER 之前插入分号)。
  • 第二个替换添加最后的分号。

关于mysql - 将 sql 模式文件的 git diff 转换为应用/撤消 sql 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33275914/

相关文章:

text - 用bash中的增量计数器替换两个字符串中包含的字符串

linux - 如何用变量替换 awk 命令的管道输出

python - 如何使用 os.walk 只列出文本文件

linux - 使用正则表达式进行 grep 搜索

MySQL自动增量加上一列中的字母数字

php - SQL 选择具有可用日期的属性

php - Laravel sql 获取顶部记录并获取其字段值平均值

php - 处理 PDO::prepare() 添加的引号

regex - 在 Linux 文件名中替换双引号以及其他无效的 Windows 文件名字符

Java:处理文本行