다음 문자열이 있습니다./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
꽤 깨끗해요.