sed를 사용하여 슬래시로 구분된 동일한 숫자의 두 인스턴스를 해당 숫자의 한 인스턴스로 어떻게 바꿀 수 있습니까?

sed를 사용하여 슬래시로 구분된 동일한 숫자의 두 인스턴스를 해당 숫자의 한 인스턴스로 어떻게 바꿀 수 있습니까?

sed슬래시로 구분된 동일한 숫자의 두 인스턴스를 이 숫자의 한 인스턴스로 바꾸고 싶습니다 . 내 입력 파일에는 다음과 같은 줄이 있습니다.

text (1982/1982) text
text (1983/1983) text
text (1984/1984) text

나는 다음과 같은 출력을 원합니다 :

text (1982) text
text (1983) text
text (1984) text

입력 파일에 슬래시로 구분된 다른 숫자 문자열이 있을 수 있으므로 괄호를 일치시켜야 합니다.

존재하다BB 에디터검색 모드와 교체 모드를 사용하여 \(([0-9]{4})/\1\)이 작업을 수행 할 수 있습니다 \(\1\). 그러나 sed동등한 확장 정규식에서는 작동하지 않는 것 같습니다.

echo 'text (1984/1984) text' | sed -E 's_\(([0-9]{4})/\1\)_\(\1\)_g'

반품:

text (1984/1984) text

하지만 나는 원한다:

text (1984) text

이를 수행할 수 있는 확장 정규식은 무엇입니까 sed?

저는 macOS에 내장된 것을 사용하고 있습니다 sed.

답변1

OSX 버전은 sed꽤 짜증납니다(실제로는 BSD 버전). 저는 보통 Brew를 통해 GNU를 설치합니다 sed:

$ brew search sed
==> Formulae
gnu-sed ✔             libxdg-basedir        minised               ssed

==> Casks
eclipse-dsl                                  marsedit
exoduseden                                   microsoft-bing-ads-editor
focused                                      osxfuse-dev
google-adwords-editor                        physicseditor
lego-mindstorms-education-ev3                prefs-editor
licensed                                     subclassed-mnemosyne

설치하세요:

$ brew install gnu-sed

그런 다음 다음과 같이 사용할 수 있습니다.

$ gsed ....

짜잔, 이제 귀하의 예가 작동합니다.

$ echo 'text (1984/1984) text' | sed -E 's_\(([0-9]{4})/\1\)_\(\1\)_g'
text (1984/1984) text
$ echo 'text (1984/1984) text' | gsed -E 's_\(([0-9]{4})/\1\)_\(\1\)_g'
text (1984) text

인용하다

관련 정보