sed를 사용하여 첫 번째 일치 그룹 뒤에 숫자를 사용하여 검색 및 바꾸기를 수행하는 방법(일치 그룹의 적절한 이스케이프)

sed를 사용하여 첫 번째 일치 그룹 뒤에 숫자를 사용하여 검색 및 바꾸기를 수행하는 방법(일치 그룹의 적절한 이스케이프)

머리말

어쩌면 이것을 변환하고 싶을 수도 있습니다:

aaaa

도착하다:

1aaa1

따라서 다음과 같이 제안해 보겠습니다.

echo aaaa | sed --regexp-extended 's/(.*)a/1\11/'
1aaa1

질문

1\11100% 유효하고 명확한 패턴 인가요 sed? sed이러한 유형의 대체에 대한 모든 모범 사례를 따랐습니까 ?

내 말은1\11 아마도아마도 둘 다일 것입니다 :

  1. char로 교체한 1다음 1° 일치 그룹, 다음으로 다른 char로 교체 1(→ 현재 동작)
  2. 문자로 바꾼 1다음11° 일치 그룹 (→ 예외 발생)

현재 내 sed 버전에 첫 번째 설명이 있는 것 같습니다. 어쨌든 이것이 문서화되어 있는지 아니면 .NET에서 가능한지 모르겠습니다 sed.

설명해 주셔서 감사합니다. 동시에 나는 이것 위에 성을 짓지 않을 것입니다.

현재 저는 GNU sed 4.7을 사용하고 있습니다.

답변1

@QuartzCristal 사용자가 말했듯이 GNU 매뉴얼 페이지 sed에는 다음 메모가 있습니다 .

s/정규식/교체/

패턴 공간과 정규식을 일치시켜 보세요. 성공하면 교체와 일치하는 부분이 교체됩니다. 대체 항목에는 패턴 공간의 일치하는 부분을 나타내는 특수 문자 &와 정규식에서 일치하는 해당 하위 표현식을 나타내는 특수 이스케이프 문자 \1~\9가 포함될 수 있습니다.

1Perl과 같은 일반 프로그래밍 언어에서 왔기 때문에 그러한 제한이 없다는 것을 몰랐습니다 9(예를 들어 를 쓸 수 있기 때문입니다 1{$19}1) sed. 따라서 구문이 현재 100% 정확하고 다르게 해석될 수 없다는 것을 알고 있습니다.

이 답변은 GNU sed에서 작동합니다. POSIX 정의인지 확실하지 않습니다.

답변2

하나 있다POSIX의 설명내용은 다음과 같습니다.

역참조 표현식 '\n'은 '\n' 앞의 '('와 ')' 사이의 하위 표현식과 동일한(비어 있을 수도 있음) 문자열과 일치해야 합니다. 문자 'n'은 n번째 하위 표현식(패턴 시작 부분에서 n번째 '('로 시작하고 해당 ')' 쌍으로 끝나는 하위 표현식)을 지정하는 1에서 9 사이의 숫자여야 합니다.

이렇게 하면 \10또는 \11.

이것은 BRE의 구문이지만 POSIX의 ERE는 역참조를 허용하지 않기 때문에 걱정할 필요가 없습니다.

GNU sed 매뉴얼에도 같은 내용이 나와 있습니다. 나는 어떤 sed도 역참조보다 더 많은 기능을 허용한다고 생각하지 않습니다 \1...\9.

또한 대체 항목의 오른쪽에는 s///캡처 대괄호에 대한 참조가 포함될 수 있습니다. 사람들은Posix에는 명확한 구별이 없습니다.:

"\n" 문자(여기서 n은 숫자)는 해당 역참조 표현식과 일치하는 텍스트로 대체되어야 합니다.

그러나 역참조와 동일한 규칙을 사용하는 것 같습니다.

GNU sed는 다음과 같이 명시적으로 명시합니다.

역참조는 백슬래시와 단일 숫자(예: "\1")로 지정됩니다.

Perl은 더 많은 역참조를 허용하는 언어입니다. 하지만 이 언어에서는 두 자리 이상의 역참조가 작성됩니다 ${23}. 나는 그러한 조항이나 유사한 조항이 일반적으로 혼란을 피하기 위한 것이라고 생각합니다.

관련 정보