2015-03-16 3 views
0

У меня есть файл, как этот Test.sql:как заменить »с„“с использованием СЭД

'here is' and \' other for 'you' 

и хотел бы заменить \' (убежали одинарную кавычку) с '' (2 одиночных кавычек) для postgres и оставить другие одиночные кавычки в одиночку. Как бы я это сделал. Я пробовал:

Mon Mar 16$ sed -i.bak s/\'/''/g test.sql 

, но это выводит все одинарные кавычки.

ответ

2

Ваш враг в этом ракурсе. Строка

s/\'/''/g 

поврежден оболочкой, прежде чем она будет передана sed. Для оболочки '' является пустой строкой, а \' подавляет это особое значение одинарных кавычек (так что котировка является фактическим символом одиночной кавычки). Что видит sed после обработки

s/'//g 

... который просто удаляет все одинарные кавычки.

Существует несколько способов решения проблемы; один из них

sed -i.bak "s/\\\\'/''/g" test.sql 

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

0
sed "s/[\\]'/''/g" test.sql 
# also work but may depend on shell 
sed "s/[\]'/''/g" test.sql 

тех же идея, как Wintermute, но используя класс avoig несколько ускользающих для оболочки, чем СЭД в двойных кавычках

Смежные вопросы