Ваш враг в этом ракурсе. Строка
s/\'/''/g
поврежден оболочкой, прежде чем она будет передана sed. Для оболочки ''
является пустой строкой, а \'
подавляет это особое значение одинарных кавычек (так что котировка является фактическим символом одиночной кавычки). Что видит sed после обработки
s/'//g
... который просто удаляет все одинарные кавычки.
Существует несколько способов решения проблемы; один из них
sed -i.bak "s/\\\\'/''/g" test.sql
Внутри дважды цитировал строки оболочки, обратные косые должны быть экранированы (существуют исключения). Это означает, что "s/\\\\'/''/g"
в команде оболочки переводится в s/\\'/''/g
как аргумент sed. В sed regexes обратная косая черта также нуждается в экранировании, так что это действительно то, что мы хотели: все экземпляры \'
будут заменены на ''
.