BSD sed에서 패턴의 일부를 일치하게 유지하고 교체하는 방법은 무엇입니까?

BSD sed에서 패턴의 일부를 일치하게 유지하고 교체하는 방법은 무엇입니까?

나는 GNU sed의 영혼을 찾았고 비슷한 것을 찾았 \1지만 터미널은 그것이 "RE에 정의되지 않았습니다"라고 말했습니다.

하지만 내가 하고 싶은 것은 이것이다.

이와 같은 문자열이 있는 경우 sinder-city1.gif이 작업을 수행하고 싶습니다 sinder-city.gif. 여러 다른 문자열에 대해 이 작업을 수행하게 되므로 전체 문자열을 바꿀 수도 없고 .gif 또는 그 앞의 모든 숫자를 제거할 수도 없습니다. 다른 패턴이 있는 경우

sinder-city2.gif
sinder-city3.gif

나는 그들이 그대로 유지되기를 바랍니다.

나는 그것을 교체하고 싶지 않습니다. 일치시키려고 들어가는데 sed 's,[a-z]1.gif,빼면 그게 남네요 sinder-cit.gif. 어떻게 일치시키나요 y?

나는 이것을하고 싶다 :

sed 's,[a-z]1.gif,[here is the last letter].gif,g'

BSD sed에서 작동해야 합니다.

답변1

sed 's,\([a-z]\)1\.gif$,\1.gif,g'

아니면 허용하고 싶다면1

sed 's,\([^0-9]\)1\.gif$,\1.gif,g'

백슬래시 대괄호 구조는 캡처링 그룹을 구분합니다.FreeBSD 매뉴얼 페이지"대괄호 표현식"이라고 합니다(대괄호를 사용함에도 불구하고 대괄호는 다른 의미를 나타냄). sed는 확장 정규식(ERE)이 아닌 기본 정규식(BRE)을 사용합니다. 매뉴얼 페이지에서는 ERE를 설명하고 마지막 단락에서는 BRE 구문과 ERE 구문의 차이점을 설명합니다. 찾았어요POSIX 사양여기에서는 캡처 그룹을 호출하여 BSD 매뉴얼 페이지보다 더 읽기 쉽습니다.역참조 표현식. 이것GNU sed 매뉴얼둘 중 어느 것보다 더 읽기 쉽습니다. GNU 확장의 기능으로 설명되는 것을 피합니다.

캡처링 그룹(역참조 표현식이라고도 함)이 주어지면 대체 텍스트에 백슬래시 + 숫자를 사용하여 "해당 캡처링 그룹과 일치하는 텍스트"를 의미할 수 있습니다. 예를 들어 \1대체 텍스트의 텍스트는 정규식의 첫 번째 캡처링 그룹과 일치하는 텍스트로 대체됩니다. 여기에는 이전 문자를 캡처하는 캡처 그룹이 있습니다 1.gif.

문자 그대로 점을 일치시키는 1.gif것으로 변경 하고 줄 끝에만 일치하도록 후행을 추가했습니다.1\.gif$

캡처링 그룹의 또 다른 예를 들자면, 임의의 확장에 대해 작업을 수행하려면 다음과 같은 것을 사용할 수 있습니다.

sed 's,\([^0-9]\)1\(\.[^./]*\)$,\1\2,g'

관련 정보