Это связано с правилом парсинга строк в двойных кавычках sh
.
Posix указывает, как sh
анализирует строки в двойных кавычках.
Обратная косая черта должна сохранять свое особое значение в качестве escape-символа (см. Escape-символ (Обратная косая черта)) только в том случае, если за ним следует один из следующих символов, если он считается специальным:
$ `" \
Другими словами, sh
оставляет обратную косую черту, за которой следуют символы, отличные от $ '".
Итак, если sh
встречает строку в двойных кавычках sed "s/\\\/\//"
, sh
анализирует ее следующим образом.
- Первые два
\\
заменены на \
. Потому что за первым \
следует второе \
.
- Третий и четвертый
\
все еще остаются в строке. Потому что за ними следует /
, что не является особенным в двойных кавычках.
После вставки sh
передает строку s/\\/\//
в sed
, которая заменяет первое вхождение \
на /
.
С тем же рассуждением, когда sh
встречает строку, "sed s/\\\\/\//"
, sh
передает /\\/\//
в sed
, что также заменяет первое вхождение \
на /
.