여러 대체를 위한 ed의 하위 표현식

여러 대체를 위한 ed의 하위 표현식

다음과 같은 텍스트가 있다고 가정해 보겠습니다.

John went with Sally to the market where they bought fresh bread. There they met with Jim and dined together.

다음과 같이 John, Sally, Jim이라는 이름을 더하기 기호로 묶는 정규식을 작성한다고 가정해 보겠습니다.

+John+ went with +Sally+ to the market where they bought fresh bread. There they met with +Jim+ and dined together.

이름을 +John+로 성공적으로 변경하는 다음 정규식을 만들었습니다.

g/\(.*\)\(\<John\>\)\(.*\)/s//\1+\2+\3/gp

명령을 다시 실행할 필요 없이 한 번에 세 가지 이름을 모두 바꾸는 이름을 만들고 싶습니다.

다음과 같은 간단한 다중 교체를 시도했습니다.

g/John/s//+&+/\
s/Sally/+&+/\
s/Jim/+&+/p

그러나 이는 각 이름의 첫 번째 인스턴스만 변경합니다.

답변1

편집 명령은 다음과 같습니다거의옳은.

g/./ s/John/+&+/g\
s/Sally/+&+/g\
s/Jim/+&+/gp

여기에는 두 가지 주요 변경 사항이 있습니다.

  1. 이 명령에 사용되는 정규식은 g명령 목록을 적용하려는 모든 행과 일치해야 합니다. 을 사용했는데 , 이는 John같은 줄에 가 없으면 Sally으로 변경되지 않음을 의미합니다.+Sally+John

    .여기서는 비어 있지 않은 모든 행을 선택하는 데 사용 하지만 예를 들어 ^또는$모두철사. ...문자열 Jim(세 이름 중 가장 짧은 이름)을 포함할 만큼 긴 줄을 선택하도록 이 방법을 사용하는 것이 더 합리적일 수 있습니다 .

  2. g깃발 을 사용하고 있어요s///모든 줄에서 겹치지 않는 모든 항목을 바꾸는 세 가지 명령 중 하나입니다. 나는 gp마지막 대체를 사용하고 있지만 명령의 효과를 보기 위해 직접 수행하기 때문입니다.

유사한 문자열과 구별해야 하고 \<John\>시스템 C 라이브러리의 BRE(Basic Regular Expressions)가 이를 지원하는 경우 대신 in을 사용하십시오(이는 BRE에서 (변경)을 사용하는 것과 같은 비표준이지만, 이를 통해 GNU 시스템에 작성할 수 있습니다.)JohnJohnny\|g/./ s/John\|Sally\|Jim/+&+/gp

답변2

어때요?

1,$g/./s/John/+&+/g;s/Sally/+&+/g;s/Jim/+&+/g

첫 번째에는 접미사 s가 있습니다 g. 이렇게 두 번째에 넣으면 각 대체 항목은 첫 번째 항목뿐만 아니라 발생하는 모든 작업을 수행합니다.

관련 정보