Поиск и замена не уважают мой токен «$1»

Поиск и замена не уважают мой токен «$1»

Использую bash shell на Ubuntu 14.04. Пытаюсь сделать простой поиск и замену в каждой строке файла. Я пробовал

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

но это оставляет мне файл, полный

DELETE FROM my_object_times where ID = '';

и все, что я хотел захватить, вообще не вставляется. Как лучше выполнить этот поиск и замену? Я ожидал, что конечные результаты будут такими

DELETE FROM my_object_times where ID = 'abcdef12341234abcdef';

решение1

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

Поскольку фрагмент Perl заключен в двойные кавычки, оболочка расширится $1до своего текущего значения (вероятно, пустого или неустановленного в вашем случае). Вам нужно экранировать знак доллара, чтобы этого не произошло. Кроме того, у вас нет группы захвата в шаблоне оператора s///, поэтому $1он ничего не будет содержать. ( perl -wили use warningsпредупредит вас об этом.)

Либо добавьте скобки к шаблону, либо используйте $&. Кроме того, глобальная замена, похоже, не очень хорошо работает с шаблоном, который может иметь нулевую ширину, поэтому я бы предложил убрать флаг g-.

Так:

perl -w -pe "s/.*/DELETE FROM my_object_times where ID = '\$&';/" 

(Хотя &это недопустимая переменная в оболочке, поэтому ее $&оставим как есть. Но в общем случае ее $необходимо экранировать.)

Обычно лучше заключать код Perl в одинарные кавычки, так как знак доллара довольно распространен в Perl. Но здесь одинарные кавычки внутри кода Perl немного усложняют задачу. Один из вариантов — представить их в шестнадцатеричном виде:

perl -w -pe 's/.*/DELETE FROM my_object_times where ID = \x27$&\x27;/' 

решение2

Это сделает это:

sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv

Связанный контент