sed 's/ /\ /g' 작동 방식

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\

이것이 어떻게 작동하는지 설명해 주실 수 있나요? 이중 백슬래시와 일치하는 항목이 없습니다.

편집하다.

이제 내 실수가 보입니다. echo에서 이중 백슬래시를 단일 백슬래시로 바꾸는 것은 sed와 아무 관련이 없습니다.

odGit 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" "$@"

답변1

이것은 sed관련이 없습니다. 당신이 보는 것은 실제로 echo그 자체로 이루어집니다.

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

\다른 문자를 이스케이프하는 데 사용되기 때문입니다 . \\"escape"를 의미하므로 하나만 \인쇄됩니다. sed입력 공간 탈출과 같은 유용한 작업을 수행 하려면 다음이 필요합니다.

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

답변2

sed는 이중 백슬래시를 보지 못할 수도 있으며 에코를 통해 하나로 병합됩니다. 설명에는 여러 수준이 있습니다. 여기서 쉘은 중요하지 않지만 echo 버전에 따라 echo가 중요합니다. 따라서 printf를 사용하는 것이 더 좋지만 printf는 첫 번째 인수도 해석한다는 점에 유의하세요. 다양한 상황에서 sed에 입력되는 내용을 살펴보세요.

$ 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

네 번째 것만 이중 백슬래시를 전송합니다. 이 백슬래시는 먼저 echo에 의해 제거되고 그 다음에는 printf에 의해 제거되고 세 번째는 셸에 의해 제거됩니다.

관련 정보