이스케이프된 슬래시와 이스케이프되지 않은 슬래시가 포함된 문자열이 있습니다.
탈출을 위한 sed 대안을 찾고 있습니다이스케이프되지 않은 슬래시만, 그러나 부정적인 LookBehind를 지원하지 않는 것 같습니다.
예:
input: "https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https://baz/test.com"
desired output: "https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https:\/\/baz\/test.com"
답변1
sed
사용POSIX 기본 정규식기본적으로 Perl 호환 정규식 언어에서 일반적으로 발견되는 예견 어설션 및 기타 너비가 0인 어설션은 제외됩니다.
대신, 이스케이프된 슬래시를 해제하고 수정된 문자열의 모든 슬래시를 이스케이프 처리하세요.
sed -e 's@\\/@/@g' -e 's@/@\\/@g'
먼저 모든 인스턴스를 로 변경한 \/
다음 /
모두 /
를 로 변경합니다 \/
. 이는 @
바꾸기 명령이 방지하기 위한 대체 구분 기호입니다.기울어진 이쑤시개 증후군(거의 모든 다른 문자를 사용할 수 있습니다).
예:
$ echo '"https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https://baz/test.com"' | sed -e 's@\\/@/@g' -e 's@/@\\/@g'
"https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https:\/\/baz\/test.com"
텍스트 줄이 셸의 문자열에 저장되어 있으면 bash
거기서 다음과 같이 할 수 있습니다.
$ string='"https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https://baz/test.com"'
$ string=${string//\\\///} # leaning toothpick warning!
$ string=${string//\//\\/}
$ printf '%s\n' "$string"
"https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https:\/\/baz\/test.com"
위의 내용은 변수 대체를 사용하여 ${variable//pattern/replacement}
in 을 모두 로 대체합니다.pattern
$variable
replacement
답변2
Perl에서는 LookBehind를 사용할 수 있습니다.
$ input="https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https://baz/test.com"
$ printf '%s\n' "$input" | perl -pe 's|(?<!\\)/|\\/|g'
https:\/\/github.com\/foo\/bar\/pull\/2934) is live at https:\/\/baz\/test.com
답변3
이것은 트릭을 수행해야합니다
sed 's:\\\?/:\\/:g'
0개 또는 1개의 백슬래시가 앞에 오는 슬래시를 이스케이프된 슬래시로 바꿉니다.
답변4
sed에는 LookBehind 단언이 없지만 시뮬레이션할 수 있습니다. 여기에는 확장 정규식 모드(-E)의 GNU sed가 표시됩니다.
sed -E '
:a
s:(^|[^\])(([\][\])*)[/]:\1\2\\/:
t a
' file
백슬래시가 아닌 것을 보거나 줄의 시작 부분에 도달하기 전에 / 왼쪽에 짝수 개의 백슬래시가 있는지 확인합니다(0은 짝수입니다).