Como funciona o sed 's / / \ / g'

2

Eu encontrei este script de linha no pacote adicionado pelo Composer

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

Eu tentei no Git Bash

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

Você pode explicar como isso funciona? Não consigo ver correspondência para a barra invertida dupla.

EDITAR

Agora vejo meu erro. A conversão de barras duplas invertidas em uma barra invertida no eco não tem nada a ver com sed.

Eu não tenho od no Git Bash, mas tentei.

$ 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

O out.txt é um caractere menor que in.txt .

Mas ainda não entendi o que o sed 's/ /\ /g' realmente faz e por quê.

O contexto inteiro pode ser útil para espectadores

#!/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" "$@"
    
por user146341 07.12.2015 / 09:14

2 respostas

1

O sed é irrelevante. O que você vê realmente é feito pelo próprio echo :

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

Isso ocorre porque \ é usado para escapar de outros caracteres. O \ é considerado como "escape do \ ", por isso apenas um é impresso. Se você quisesse fazer com que o sed fizesse algo útil, como escapar dos espaços da entrada, você precisaria:

$ echo "foo\bar\ foo/baz/ qux\bax\ " | sed 's/ /\ /g'
foo\bar\ foo/baz/\ qux\bax\ 
    
por 07.12.2015 / 11:43
0

sed provavelmente nem vê as barras duplas invertidas, elas são mescladas em uma por eco. Existem vários níveis de interpretação. O shell não deve importar aqui, mas dependendo da versão do eco, o eco importa. Portanto, é melhor usar printf, mas preste atenção ao fato de que printf também interpreta seu primeiro argumento. Então olhe para o que é alimentado em sed em vários casos:

$ echo "foo\bar\ foo/baz/ qux\bax\ " | od -t c
0000000   f   o   o  \b   a   r   \       f   o   o   /   b   a   z   /
0000020       q   u   x   \   b   a   x   \      \n
0000033
$ printf "foo\bar\ foo/baz/ qux\bax\ " | od -t c
0000000   f   o   o  \b   a   r   \       f   o   o   /   b   a   z   /
0000020       q   u   x   \   b   a   x   \    
0000032
$ printf '%s\n' foo\bar\ foo/baz/\ qux\bax\  | od -t c
0000000   f   o   o   b   a   r       f   o   o   /   b   a   z   /    
0000020   q   u   x   \   b   a   x   \  \n
0000031
$ printf '%s\n' "foo\bar\ foo/baz/ qux\bax\ " | od -t c
0000000   f   o   o   \   b   a   r   \       f   o   o   /   b   a   z
0000020   /       q   u   x   \   \   b   a   x   \   \      \n
0000036

Apenas o quarto tem barras invertidas duplas transmitidas, elas são removidas primeiro por eco, depois por printf e em terceiro pelo shell.

    
por 07.12.2015 / 09:34

Tags