Сценарии оболочки. Проблема подстановки команд в моем скрипте - PullRequest
3 голосов
/ 13 июля 2009

На обоих компьютерах Cygwin и Linux (Debian) у меня возникла одна и та же проблема:

Я работаю в сценарии оболочки с некоторыми идентификаторами форматирования, я хочу добавить обратную косую черту () перед появлением косой черты (/).

Мой сценарий sed хорошо работает на моем терминале:

# export someid="314-12345/08"
# echo "${someid}" | sed 's/\//\\\//'

Выход:

314-12345\/08

Но не так хорошо, если я запускаю подстановка команд :

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
sed: -e expression #1, char 9: unknown option to `s'

Что мне здесь не хватает?

Заранее спасибо.

Ответы [ 2 ]

13 голосов
/ 13 июля 2009

Нет необходимости использовать / в качестве разделителя для sed.

s/a/c/

Может стать

s#a#c#

Так в вашем случае:

someidformatted=`echo "${someid}" | sed 's#\/#\\\/#'`

сделает работу.

Я могу только догадываться, что проблема была вызвана отсутствием / побегом.

8 голосов
/ 13 июля 2009

Вот что происходит. Из справочной страницы bash (1), выделение мое:

Когда используется форма замещения в старом стиле, обратная косая черта сохраняет свое буквальное значение , за исключением случаев, когда следуют $, ‘или \. Первая обратная кавычка, которой не предшествует обратная косая черта, завершает подстановку команды. При использовании формы $ (команда) все символы в скобках составляют команду; никто не лечится специально.

Так что, скорее всего, вам нужно больше обратной косой черты для подстановки команды, чем простой команды. Вы можете отладить это, установив set -x:

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
++ echo 314-12345/08
++ sed 's/\//\\//'
sed: 1: "s/\//\\//": bad flag in substitute command: '/'
+ someidformatted=
# someidformatted=$(echo "${someid}" | sed 's/\//\\\//')
++ echo 314-12345/08
++ sed 's/\//\\\//'
+ someidformatted='314-12345\/08'

Итак, вы можете видеть, что вхождение \\ превращается в \. Добавление дополнительной обратной косой черты работает, но я предпочитаю форму $(command):

# someidformatted=$(echo "${someid}" | sed 's/\//\\\//')
...