Команда Sed не распознает апострофы
В моем скрипте bash я пытаюсь заменить все апострофы (') двумя апострофами ('') в файле csv, чтобы зафиксировать его в базе данных postgres. Как вы знаете, все одинарные кавычки в запросе postgres должны быть отделены апострофом.
Я не могу использовать двойные кавычки вокруг моих переменных в моем запросе, потому что они тоже содержат двойные кавычки. Так что нет простого выхода, кроме как заменить одеяло с помощью sed. Я экспериментировал со следующими способами, но безрезультатно:
sed "s/\'/\'\'/g" test.txt #Does not work
sed "s/'/''/g" test.txt #Does not work
sed s/\'/"\'\'"/g test.txt #Does not work
У кого-нибудь есть идеи о том, как я могу заставить это работать?
3 ответа
Это будет работать для вас:
sed "s/'/''/g" <<< "test'test"
Поскольку вы используете двойные кавычки для заключения команды, апостроф не должен быть экранирован.
Кстати, если вы хотите использовать одинарные кавычки для включения самой команды, вы можете использовать восьмеричное представление апострофа \047
в команде:
sed 's#\047#\047\x47#g' <<< "test'test"
Поскольку вы указали:
Я не могу использовать двойные кавычки
Вы можете рассмотреть возможность использования $'...'
если ваша оболочка это позволяет (sh
, ksh
, bash
и другие делают)
sed $'s/\'/\'\'/g'
Это может работать для вас (GNU sed):
sed 's/'\''/&&/g' file
Второй '
заканчивает цитирование первой части замещающей команды. Третий '
находится в оболочке и цитируется таким образом \'
, Остальная часть команды замещения тогда заключена в кавычки. С использованием &&
а сокращение всего совпадения в LHS команды подстановки удвоилось.
NB. Всегда желательно использовать одинарные кавычки для цитирования команд sed, поскольку это исключает возможность случайной интерпретации оболочкой символов в команде.