Isso fará isso:
sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv
Usando o shell bash no Ubuntu 14.04. Tentando fazer uma pesquisa simples e substituir em cada linha de um arquivo. Eu tentei
perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv
mas isso me deixa com um arquivo cheio de
DELETE FROM my_object_times where ID = '';
e tudo que eu queria capturar não é inserido. Qual é a melhor maneira de fazer essa pesquisa e substituir? Eu esperava que os resultados finais fossem algo como
DELETE FROM my_object_times where ID = 'abcdef12341234abcdef';
perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv
Como o trecho Perl está entre aspas duplas, o shell expandirá $1
para qualquer valor atual (provavelmente vazio ou não definido no seu caso). Você precisa escapar do cifrão para evitar isso. Além disso, você não tem um grupo de captura no padrão do operador s///
, portanto, $1
não conteria nada. ( perl -w
ou use warnings
avisaria sobre isso.)
Adicione parênteses ao padrão ou use $&
.
Além disso, a substituição global parece não funcionar bem com um padrão que pode ser de largura zero, então sugiro remover o g
-flag.
Então:
perl -w -pe "s/.*/DELETE FROM my_object_times where ID = '\$&';/"
(Embora &
não seja uma variável válida no shell, então $&
será deixado como está. Mas, em geral, o $
precisaria ser escapado.)
Normalmente, colocar o código Perl entre aspas simples seria melhor, já que o sinal de dólar é bastante comum em Perl. Mas aqui as aspas simples dentro do código Perl tornam isso um pouco difícil. Uma opção é apresentá-las em hexadecimal:
perl -w -pe 's/.*/DELETE FROM my_object_times where ID = \x27$&\x27;/'