이스케이프되지 않은 슬래시를 이스케이프하세요.

이스케이프되지 않은 슬래시를 이스케이프하세요.

이스케이프된 슬래시와 이스케이프되지 않은 슬래시가 포함된 문자열이 있습니다.

탈출을 위한 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$variablereplacement

답변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은 짝수입니다).

관련 정보