插入命令的复杂sed命令

时间:2016-01-19 19:33:11

标签: sed grep regex php

我有一堆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

3 个答案:

答案 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'
      • else追加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