0

我有一个我正在尝试使用 AWK 操作的 SQL 文件。我有以下行来拆分我的 SQL 文件,VALUES因为我想以不同的方式处理该字段之前和之后的文本。

原始文件如下所示:

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

有没有办法像这样以不同的方式操纵变量?

4

4 回答 4

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 正则表达式更改为

/drt_mig_user`\.|[\047`]/
于 2014-09-22T13:19:50.523 回答
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') ");

最初我试图逃避单引号而不是反引号,因为我混淆了两者,任何寻找答案的人都应该查看这个 SO answer

于 2014-09-22T10:45:37.523 回答
0

上面的脚本在给定的情况下可以正常工作。

如果您想要一个适用于所有情况的标准脚本,那么您可以使用下面的脚本。它不会替换 $1 中的所有点 (.)

awk -F'VALUES' '{gsub(/`|drt_mig_user../,"",$1); printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2);}' file.txt
于 2014-09-23T06:43:48.197 回答
-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
于 2014-09-22T12:37:16.360 回答