我有一个SQL文件,我试图使用AWK进行操作。我有以下行在VALUES
上拆分我的SQL文件,因为我想以不同的方式处理此字段之前和之后的文本。
原始文件如下所示:
INSERT INTO `drt_mig_user`.`parametric_object`(`id`, `active`, `priority`, `createdatetime`, `lastupdatedatetime`, `discriminator`) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate')
我的AWK代码:
cat file.txt | awk -F'VALUES' '{printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2)}'
产生这个:
$this->addSql("INSERT INTO `drt_mig_user`.`parametric_object`(`id`, `active`, `priority`, `createdatetime`, `lastupdatedatetime`, `discriminator`) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate') ");
现在我需要做的就是删除drt_mig_user并从整个第一个变量$1
中删除反引号,使它看起来像这样:
$this->addSql("INSERT INTO parametric_object(id, active, priority, createdatetime, lastupdatedatetime, discriminator) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate') ");
有没有办法以不同的方式操纵变量?
答案 0 :(得分:3)
要从您发布的输入中获得所需的输出,只需:
$ awk -F'VALUES' '{gsub(/drt_mig_user`\.|`/,"",$1); printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2);}' file
$this->addSql("INSERT INTO parametric_object(id, active, priority, createdatetime, lastupdatedatetime, discriminator) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate')");
如果您在$ 1中有单引号,只需将gsub regexp更改为
即可/drt_mig_user`\.|[\047`]/
答案 1 :(得分:1)
您可以在打印前将结果gsub。答案是:
awk -F'VALUES' '{gsub(/`/,"",$1); gsub("drt_mig_user.", "", $1); printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2);}'
产生所需的:
$this->addSql("INSERT INTO parametric_object(id, active, priority, createdatetime, lastupdatedatetime, discriminator) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate') ");
最初我试图逃避单引号而不是后退,因为我混淆了两者,任何寻找答案的人都应该查看this SO answer。
答案 2 :(得分:0)
以上脚本适用于特定情况。
如果你想要一个适用于所有情况的标准脚本,那么你可以使用下面的脚本。它不会替换$ 1中的所有点(。)
awk -F'VALUES' '{gsub(/`|drt_mig_user../,"",$1); printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2);}' file.txt
答案 3 :(得分:-1)
如果你愿意,你也可以使用一个简单的循环
while read query do
first_part_temp=$( echo ${query} | awk -F 'VALUES' '{print $1}')
second_part=$(echo ${query} | awk -F 'VALUES' '{print $2}' file.txt)
first_part=$(echo $first_part_temp | sed s/\`//g | sed s/drt_mig_user.//g)
echo "\$this->addSql(\"${first_part} VALUES ${second_part} \");" >> output.txt
done < file.txt
或者如果您想使用单行,则可以使用:
awk -F'VALUES' '{gsub(/`|drt_mig_user|\./,"",$1); printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2);}' file.txt