Se você insistir em usar sed, você pode usar dois comandos s
sucessivos. Para evitar que o segundo seja executado após o primeiro na mesma linha, adicione um comando t
entre; isso pula todos os comandos restantes se o comando anterior s
fez uma substituição.
sed -e "s/\"select[^\";]* where /&admin_id = '\$admin_id' and /" -e t \
-e "s/\"select[^\"]*/& where admin_id = '\$admin_id' /" \
-i *.php
Tenha em atenção que isto não é robusto: não irá lidar com cláusulas select
em que a seleção de campo é dividida em várias linhas; não irá lidar com consultas que não tenham where
mas, por ex. um group by
na mesma linha, ele será danificado se uma consulta contiver where
como substring, etc. Revise as entradas e saídas para certificar-se de não atingir nenhum dos casos problemáticos.
Com o perl, você pode usar um operador de repetição não ganancioso para interromper a correspondência na primeira palavra reservada ou fim da consulta. Isso ainda é aproximado, mas um pouco mais robusto. O Perl também permite que a substituição seja uma expressão arbitrária que construa a string de substituição (com o sufixo e
após a substituição), para que possamos colocar uma condição lá.
perl -i -p -e '
s[("select.*?)(\b(?:where|group|having|order|limit|procedure|into|for|lock)\b|[;"]|$)]
[$1 . " where admin_id = '\$admin_id' " . ($2 eq "where" ? "and" : $2)]e
' *.php
P.S. que "…'$admin_id'…"
parece uma injeção SQL esperando para acontecer, a menos que $admin_id
não possa conter '
(e eu acho que o UTF-8 mal formado também pode ser problemático).