sed를 사용하여 정방향 및 백슬래시를 이스케이프합니다.

sed를 사용하여 정방향 및 백슬래시를 이스케이프합니다.

다음 문자열이 있습니다./tmp/test/folder1/test.txt

대신 사용하고 싶은 것 sed- 예를 들면 다음과 같습니다./\/

\/tmp\/test\/folder1\/test.txt

그래서 나는 다음을 발행합니다:

echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\//g"

반환되지만:

sed: -e 표현식 #1, 문자 9: 's'에 대한 알 수 없는 옵션

나는 앞으로 및 백 슬래시를 이스케이프하고 있습니다. 여기서 내가 어디로 잘못 가고 있는지 잘 모르겠습니다.

답변1

\교체된 모든 슬래시 /와 모든 백슬래시를 각각 이스케이프(backslashes 사용)해야 합니다 .\

$ echo "/tmp/test/folder1/test.txt" | sed 's/\//\\\//g'
\/tmp\/test\/folder1\/test.txt

그러나 이것은 전혀 읽을 수 없습니다.

그러나 sed거의 모든 문자를 구분 기호로 사용할 수 있습니다. /이는 슬래시 자체를 바꾸려는 경우에 특히 유용하므로 /(예: ;세미콜론을 구분 기호로 사용하면 명령이 더 간단해집니다.)

echo "/tmp/test/folder1/test.txt" | sed 's;/;\\/;g'

기타 경우:

  • 슬래시를 구분 기호로 사용하고 큰따옴표를 사용하려면 이스케이프된 모든 백슬래시를 다시 이스케이프하여 리터럴 값을 유지해야 합니다.

    echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\\//g"
    
  • 따옴표가 전혀 필요하지 않으면 또 다른 백슬래시가 필요합니다.

    echo "/tmp/test/folder1/test.txt" | sed s/\\//\\\\\\//g
    

답변2

또는 값이 (bash) 쉘 변수에 있는 경우:

var=/tmp/test/folder1/test.txt
$ echo "${var//\//\\\/}"
\/tmp\/test\/folder1\/test.txt

처음으로 //시작매개변수 확장, 교체하라고 함모두교체와 일치합니다. 다음은 일치시킬 이스케이프 문자이고 \/, 이스케이프 문자 뒤에 대체 문자가 옵니다./\\\/\/

답변3

최종 해결책은 다음과 같습니다.

$ sed 's:/:\\/:g'  <<<"$str"
\/tmp\/test\/folder1\/test.txt

하지만 거기까지 가는 방법을 설명하자면:
예, 백슬래시를 놓쳤습니다.

$ str='/tmp/test/folder1/test.txt'
$ sed "s/\//\\\\\//g" <<<"$str"
\/tmp\/test\/folder1\/test.txt

명확히 할 수 있는 공간이 있었으면 좋겠습니다.

$ sed "s/\//\\\\ \//g"  <<<"$str"
\ /tmp\ /test\ /folder1\ /test.txt

그러나 sed 구분 기호를 다음과 같이 변경하려는 경우 :(예:)

$  sed "s:\/:\\\\\/:g"  <<<"$str"
\/tmp\/test\/folder1\/test.txt

그러나 이는 엄밀히 말하면 사실이 아닙니다. 왜냐하면 (현재는 구체적이지 않지만) /스케이핑이 필요하지 않기 때문입니다.

$ sed "s:/:\\\\/:g"  <<<"$str"
\/tmp\/test\/folder1\/test.txt

그리고 큰따옴표 대신 작은따옴표를 사용하면 쉘은 큰따옴표를 \\1로 변경하지 않으므로 더 적은 것이 \정확합니다.

$ sed 's:/:\\/:g'  <<<"$str"
\/tmp\/test\/folder1\/test.txt

꽤 깨끗해요.

관련 정보