A pesquisa e substituição não está respeitando meu token "$ 1"

1

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';
    
por Dave 11.04.2017 / 17:52

2 respostas

0

Isso fará isso:

sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv
    
por 11.04.2017 / 18:03
1
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;/' 
    
por 11.04.2017 / 20:22