Você pode usar um loop de leitura com um delimitador diferente de "newline". Isso faria com que o comando read
em bash
considerasse várias linhas como uma, desde que elas terminassem em seu delimitador.
Nota: este método não é adequado se o ponto-e-vírgula puder aparecer no arquivo dentro de comentários ou cadeias de caracteres. Isso não é um analisador - apenas um loop de leitura simples.
while read -rd ';' sql
do
if [ "${sql#SELECT}" = "$sql" ]
then
echo "Not a SELECT!"
else
echo "This is the command I got:"
echo ">>$sql<<"
fi
done < test.txt
O read -rd ';' sql
vai ler a entrada até ver um ponto e vírgula. O bloco vai estar na variável $sql
.
O if
dentro do loop verifica se a remoção da palavra SELECT
do início do texto na variável a altera - é basicamente perguntando se o texto não começa com a palavra SELECT
.
Observe que read
removerá os espaços em branco inicial e final em cada bloco enquanto estiver procurando por "palavras". Linhas vazias antes e depois do ponto-e-vírgula são, portanto, removidas.
Exemplo de arquivo de texto:
SELECT *
FROM PLANTS
WHERE TYPE='BUSH'
;
INSERT INTO PLANTS (TYPE,NAME,ID)
VALUES ('TREE', 'Oak', 15) ;
SELECT NAME
FROM PLANTS
WHERE NAME LIKE 'O%';
Resultará na seguinte saída:
This is the command I got:
>>SELECT *
FROM PLANTS
WHERE TYPE='BUSH'<<
Not a SELECT!
This is the command I got:
>>SELECT NAME
FROM PLANTS
WHERE NAME LIKE 'O%'<<