사용. . . 교체 "\/"

사용. . . 교체 "\/"

/tmp/testing대체하고 싶은 문자열이 있습니다 .\/tmp\/testing

sed다음과 같이 잘 작동합니다.

echo testdir=/tmp/testing | sed 's/\//\\\//g'
testdir=\/tmp\/testing

그러나 나중에 사용하려는 변수에 이를 넣으려고 하면 다음 오류가 발생합니다.

myvar=`echo testdir=/tmp/testing | sed 's/\//\\\//g'`
sed: -e expression #1, char 9: unknown option to `s'

어떤 아이디어가 있나요?

답변1

백틱은 `...`간접 수준을 추가하고 또 다른 \이스케이프 세트가 필요합니다. 이것을 사용하면 $( ... )잘 작동하고 예상대로 작동합니다.

myvar=$(echo testdir=/tmp/testing | sed 's/\//\\\//g')
echo "$myvar"
testdir=\/tmp\/testing

백틱 사용을 고집하면 다음과 같이 작동합니다.

myvar=`echo testdir=/tmp/testing | sed 's/\//\\\\\//g'`
echo "$myvar"
testdir=\/tmp\/testing

답변2

이 시도

$ echo testdir=/tmp/testing | sed 's/\//\\\//g'
testdir=\/tmp\/testing

변수에

var=$(echo testdir=/tmp/testing | sed 's/\//\\\//g')

답변3

백틱 안의 백슬래시는 일종의 특별한 경우입니다. 이것이 백틱을 절대 사용하지 않는 또 다른 이유입니다 $(cmd). http://mywiki.wooledge.org/BashFAQ/082

참조를 설정할 수 있습니다.많은/예를 들어 패턴에 .

myvar=$(printf '%s' "$oldpath" | sed 'sX/X\\/Xg')

또는 bash를 사용하고 있다는 것을 알고 있다면 데이터 수정을 printf피하기 위해 사용하지 말고(예: 파일 이름이 로 시작하는 경우 ) 순수 bash 문자열 조작만 사용하십시오.echo-

myvar=${foo//\//\\/}   # sed 'sX/X\\/Xg'

/구분 기호 역할을 하는 다른 방법이 없기 때문에 읽기가 더 어렵습니다 . 더 좋은 점은 /패턴의 시작 부분에서 모든 항목을 바꾸는 것을 의미합니다. 또한 패턴과 대체는 다르게 처리됩니다. sed가 사용하는 것과 같은 후행이 없으므로 대체 문자열에서 es를 이스케이프 처리 /할 필요가 없습니다 . /그럼에도 불구하고 여러 면에서 sed와 다르므로 의견을 남겨야 합니다.

성능과 견고성 측면에서는 "더 우수"하지만 가독성이나 이식성 측면에서는 그렇지 않습니다. 이것은 쉘 프로그래밍 과정과 유사합니다.

답변4

bash변수 확장|교체를 사용할 수 있습니다.

testdir="${testdir//\//\\\/}"

관련 정보