Usando o shell bash no Ubuntu 14.04. Tentando fazer uma pesquisa simples e substituir 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 está inserido. Qual é a melhor maneira de fazer essa pesquisa e substituição? Eu esperava que os resultados finais fossem algo como
DELETE FROM my_object_times where ID = 'abcdef12341234abcdef';
Responder1
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 será expandido $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 possui um grupo de captura no padrão do s///
operador, portanto $1
não conteria nada. ( perl -w
ou use warnings
avisaria você sobre isso.)
Adicione parênteses ao padrão ou use $&
. Além disso, a substituição global não parece funcionar bem com um padrão que pode ter largura zero, então sugiro remover o g
sinalizador.
Então:
perl -w -pe "s/.*/DELETE FROM my_object_times where ID = '\$&';/"
(Embora &
não seja uma variável válida no shell, $&
será deixada como está. Mas, em geral, $
seria necessário escapar.)
Normalmente, seria melhor colocar o código Perl entre aspas simples, já que o cifrão é bastante comum em Perl. Mas aqui as aspas simples dentro do código Perl tornam isso um pouco difícil. Uma opção é apresentá-los em hexadecimal:
perl -w -pe 's/.*/DELETE FROM my_object_times where ID = \x27$&\x27;/'
Responder2
Isso fará isso:
sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv