Использую 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