Избегание одинарных кавычек - PullRequest
1 голос
/ 02 февраля 2012

Я хочу заменить двойные кавычки в команде sed в следующем примере на одинарные кавычки.

set new_string to do shell script "echo " & quoted form of list_string & " | sed -e 's/$/\"/' -e 's/^/\"/' -e 's/^/+/'"

Однако, если я заменяю двойные кавычки одинарными, я получаю сообщение об ошибке, есть ли способ избежать одинарных кавычек?

Я не седь ниндзя, поэтому любые советы о том, как это сделать, очень ценятся.

Ответы [ 3 ]

8 голосов
/ 02 февраля 2012

, если вы хотите заменить " на ', используя sed:

sed 's/"/\x27/g' yourFile


\x27 - single
\x22 - double

, это может сделать код более чистым и с меньшим количеством escape.

см. Тест:

kent$  cat quote.tmp 
""""""

kent$  sed 's/"/\x27/g' quote.tmp
''''''
2 голосов
/ 02 февраля 2012

у вас была ошибка цитаты.Просто, чтобы заменить двойные кавычки на одинарные, этого достаточно

set list_string to "This program said: \"Hello World!\""
set new_string to do shell script "/bin/echo -n " & quoted form of list_string & " | sed -e 's/\"/'\\''/g'"

Объяснение 's / \ "/' \ '' / g '

\\ and \" необходимо вЯблочный скрипт и будет в оболочке просто \ и ". Итак, что входит в оболочку это 's /" /' \ '' / g '.Тогда что со всеми цитатами?Очень распространенная ошибка - думать, что цитаты в командной строке работают так же, как в программировании.Одиночная кавычка включает или выключает замену.Таким образом, первая одинарная кавычка отключает подстановку, что означает, что следующие символы будут интерпретироваться как текст и не имеют специального значения (включая escape-символ).Таким образом, чтобы избежать одиночной кавычки, нам нужно включить подстановку, тогда мы можем избежать одиночной кавычки и снова отключить подстановку.

1 голос
/ 02 февраля 2012

Вы должны быть осторожны с тем, какие кавычки анализируются sed, а какие анализируются средой, вызывающей sed.Обычные вызовы sed происходят из сценариев оболочки, но (основываясь на вашем теге) кажется, что вы вызываете его из AppleScript.

Из сценария оболочки вы можете сказать

| sed -e 's/$/'\''/' -e 's/^/'\''/' -e 's/^/+/'

Но я не знаю, действуют ли для вас правила экранирования в стиле sh или вам нужно дополнительно экранировать \

...