
/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//\//\\\/}"