Как работает sed 's / / \ / g'

Я нашел этот скрипт в пакете, добавленном Composer

dir=$(echo $dir | sed 's/ /\ /g') 

Я пробовал в Git Bash

 $ echo $(echo "foo\bar\ foo/baz/ qux\\bax\\ " | sed 's/ /\ /g') foo\bar\ foo/baz/ qux\bax\ 

Можете ли вы объяснить, как это работает? Я не вижу соответствия для двойной обратной косой черты.

РЕДАКТИРОВАТЬ.

Теперь я вижу свою ошибку. Превращение двойной обратной косой черты в одну обратную косую черту в эхо не имеет ничего общего с sed.

У меня нет ни od в Git Bash, но я попробовал.

 $ echo "foo\bar\ foo/baz/ qux\\bax\\ " >in.txt $ echo $(echo "foo\bar\ foo/baz/ qux\\bax\\ " | sed 's/ /\ /g') >out.txt $ cmp -l in.txt out.txt 27 40 12 cmp: EOF on out.txt 

out.txt – один символ короче, чем in.txt .

Но я до сих пор не понимаю, что действительно делает sed 's/ /\ /g' и почему.

Может ли весь контекст быть полезным для зрителей

 #!/usr/bin/env sh dir=$(d=${0%[/\\]*}; cd "$d"; cd "../squizlabs/php_codesniffer/scripts" && pwd) # See if we are running in Cygwin by checking for cygpath program if command -v 'cygpath' >/dev/null 2>&1; then # Cygwin paths start with /cygdrive/ which will break windows PHP, # so we need to translate the dir path to windows format. However # we could be using cygwin PHP which does not require this, so we # test if the path to PHP starts with /cygdrive/ rather than /usr/bin if [[ $(which php) == /cygdrive/* ]]; then dir=$(cygpath -m $dir); fi fi dir=$(echo $dir | sed 's/ /\ /g') "${dir}/phpcs" "$@" 

  • Проблема декодирования вывода регулярного выражения {m, n} в sed
  • удалить строки файла из файла
  • sed - Как мне сопоставить этот шаблон?
  • Как я могу использовать переменные при выполнении sed?
  • Заменить произвольные числа слова
  • Что не так с экранированной новой строкой в ​​этой команде sed?
  • как удалить пустые строки из диапазона файлов в оболочке
  • Замените содержимое группы захвата регулярного выражения, используя sed
  • 2 Solutions collect form web for “Как работает sed 's / / \ / g'”

    sed имеет значения. То, что вы видите, фактически выполняется самим echo :

     $ echo "foo\bar\ foo/baz/ qux\\bax\\ " foo\bar\ foo/baz/ qux\bax\ 

    Это происходит потому, что \ используется для выхода из других символов. \\ принято понимать как «побег», поэтому печатается только один. Если вы хотите, чтобы sed сделал что-то полезное, например, избегая пробелов ввода, вам понадобится:

     $ echo "foo\bar\ foo/baz/ qux\\bax\\ " | sed 's/ /\\ /g' foo\bar\\ foo/baz/\ qux\bax\\ 

    sed, вероятно, даже не видит двойных обратных косых черт, они сливаются в одно из-за эха. Существует несколько уровней интерпретации. Оболочка не должна иметь значения здесь, но в зависимости от версии эха, эхо имеет значение. Поэтому лучше используйте printf, но обратите внимание на то, что printf также интерпретирует свой первый аргумент. Так что посмотрите, что подано в sed в разных случаях:

     $ echo "foo\bar\ foo/baz/ qux\\bax\\ " | od -tc 0000000 foo \bar \ foo / baz / 0000020 qux \ bax \ \n 0000033 $ printf "foo\bar\ foo/baz/ qux\\bax\\ " | od -tc 0000000 foo \bar \ foo / baz / 0000020 qux \ bax \ 0000032 $ printf '%s\n' foo\bar\ foo/baz/\ qux\\bax\\ | od -tc 0000000 foobarfoo / baz / 0000020 qux \ bax \ \n 0000031 $ printf '%s\n' "foo\bar\ foo/baz/ qux\\bax\\ " | od -tc 0000000 foo \ bar \ foo / baz 0000020 / qux \ \ bax \ \ \n 0000036 

    Только четвертый передаёт двойную обратную косую черту, сначала они удаляются эхом, затем printf и третья – оболочкой.

    Linux и Unix - лучшая ОС в мире.