我有一堆php
个文件,它们有很多insert
个命令。
在每个查询中,我想插入一个列变量admin_id = '$admin_id'
,
即,如果查询是
insert into users (ch_id, num_value) values ('2', '100')
查询应转换为
insert into users (admin_id, ch_id, num_value) values ($admin_id, '2', '100')
为此,我执行了以下命令
sed -i 's/\(insert.*into.*\) (\(.*values\)/\1 (admin_id, \2/' *.php
和
sed -i "s/\(insert.*into.*\) values (/\1 values ('\$admin_id', /" *.php
上述方法已成功运行,但在查询中没有where
的SQL查询仍然存在问题,即
insert into abctable (id,no)
到
insert into tablename (admin_id, id, no)
和
insert into abctable select $column from $tableperiod
到
insert into abctable select $column from $tableperiod where admin_id='$admin_id'
和
insert into abctable select $column from $tableperiod where abc != 'xyz'
到
insert into abctable select $column from $tableperiod where admin_id = '$admin_id' and abc != 'xyz'
如何在这些查询中插入admin_id
?
通过以下列方式将查询传递给函数来执行php文件中的查询:
execute_query("insert * from $table order by username");
我可以找到仍然需要修改的查询 执行
grep 'execute_query' *| grep insert| grep -v admin_id > stillleft.txt
答案 0 :(得分:0)
我不确定我的测试用例是否正确,但我认为这可以帮到你:
我更改了第一个声明,因为我觉得它更容易,它与你的sed的第一个和第二个命令相匹配
sed -i 's/\(insert into .* (\)\(.*) values (\)\(.*\)) /\1admin_id, \2\$admin_id, \3/' *.php
第二个(你要找的第一个)应该使用以下
sed -i 's/\(insert into .* (\)\(.*) \)/\1admin_id, \2/' *.php
最后两个应该适用于此:
sed -i "s/\(insert into \w* select \$column from \$tableperiod\)/\1 where admin_id='\$admin_id'/" *.php
我希望这对您有用,如果没有,请发送一点测试数据,如果用您的问题文本测试命令作为输入
答案 1 :(得分:0)
我使用多个sed命令,每次都会遍历完整的文件。你可以一次完成。假设输入文件infile
如下所示:
insert into users (ch_id, num_value) values ('2', '100')
insert into abctable (id, no)
insert into abctable select $column from $tableperiod
insert into abctable select $column from $tableperiod where abc != 'xyz'
我们可以使用以下sed脚本sedscr
/^insert into/ {
s/\(([^)]*)\)(.*)\(([^)]*)\)/(admin_id, \1)\2($admin_id, \3)/
s/^([^(]+)\(([^)]*)\)$/\1(admin_id, \2)/
/\(.*\)/! {
/where/s/$/ and admin_id ='$admin_id'/
/where/!s/$/ where admin_id='$admin_id'/
}
}
它执行以下操作:
insert into
开头,那么
admin_id
,在第二个中插入$admin_id
admin_id
and admin_id = '$admin_id'
where admin_id='$admin_id'
可以这样调用:
$ sed -rf sedscr infile
insert into users (admin_id, ch_id, num_value) values ($admin_id, '2', '100')
insert into abctable (admin_id, id, no)
insert into abctable select $column from $tableperiod where admin_id='$admin_id'
insert into abctable select $column from $tableperiod where abc != 'xyz' and admin_id ='$admin_id'
如果您不能使用扩展的正则表达式(-r
),则必须反转括号的引用(所有\(
变为(
等)和{{ 1}}必须由+
替换。
\{1,\}
等繁琐的正则表达式代表"在字面括号之间,捕获零个或多个字符不一个右括号" - 这可以实现非贪婪的捕捉。
答案 2 :(得分:0)
我已使用以下命令
解决了这个问题sed -e "s/\(query.*insert.*select.*where\)/& admin_id='\$admin_id' and /g" -e t \
-e "s/\(query.*insert.*select.*\)\")/\1 where admin_id='\$admin_id\")'/g" -e t \
-e "s/\(query.*insert.*\)(\(.*\)values (/\1(admin_id, \2values ('\$admin_id', /g" -e t \
-e "s/\(query.*insert.*(\)/& admin_id, /g" \
-i *.php