Pesquisar e substituir não respeita meu token "$1"

Pesquisar e substituir não respeita meu token "$1"

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 $1para 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 $1não conteria nada. ( perl -wou use warningsavisaria 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 gsinalizador.

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

informação relacionada