Sed: 패턴을 다른 모든 개행 문자로 바꾸시겠습니까?

Sed: 패턴을 다른 모든 개행 문자로 바꾸시겠습니까?

sed매번 발생할 때마다 패턴을 대체하도록 지시하는 방법이 있습니까 ? 아니면 적어도 다른 행마다? (물론 스크립트를 사용하는 것도 가능하지만, 할 sed수 있는지 스스로에게 물어봤습니다.)

편집하다

내가 찾은

sed -e "s/pattern/replacement/g;n"

그러나 두 번째 발생이 아닌 첫 번째 발생을 대체합니다.

입력 파일:

I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern

원하는 출력:

I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement

답변1

sed 's/pattern/replacement/2'

패턴이 있는 각 줄의 두 번째 항목이 대체됩니다.


GNU가 있는 경우 sed:

sed '1~2N ; s/pattern/replacement/2'

첫 번째 줄부터 시작하여 1그 뒤의 줄이 패턴 공간에 추가되고 N명령 s이 두 번째 패턴 발생을 대체합니다. 그런 다음 sed두 줄 아래로 이동 ~2하고 반복하십시오.

답변2

바라보다https://stackoverflow.com/questions/5858200/sed-replace-every-nth-occurrence

솔루션은 sed 대신 awk를 사용하지만 "작업에 적합한 도구를 사용합니다". 그럴 수도 있고 아닐 수도 있다가능한sed에서 실행되지만 그럼에도 불구하고많은awk나 Perl과 같은 도구를 사용하는 것이 더 쉽습니다.

답변3

간단한 설명:

PATTERN이 한 번 이상 포함된 첫 번째 줄에서는 이를 무시하고 해당 줄을 그대로 인쇄하려고 합니다. PATTERN이 한 번 이상 포함된 두 번째 줄에서 PATTERN의 첫 번째 인스턴스를 REPLACMENT로 바꾸려고 합니다. PATTERN이 한 번 이상 포함된 세 번째 줄에서는 해당 줄을 그대로 인쇄하려고 합니다. PATTERN이 한 번 이상 포함된 네 번째 줄에서 PATTERN의 첫 번째 인스턴스를 REPLACMENT로 바꾸려고 합니다. 등. PATTERN과 일치하지 않는 행은 변경되지 않고 인쇄되어야 합니다.

이 작업은 Sed를 사용하여 다음과 같이 쉽게 수행할 수 있습니다.

sed -e '/PATTERN/ { :inside' -e 'n;s//REPLACEMENT/;t' -e 'b inside' -e '}'

또는 공백을 줄이고 레이블을 더 짧게 사용하세요.

sed -e '/PATTERN/{:i' -e 'n;s//REPLACEMENT/;t' -e 'b i' -e '}'

편집: 방금 질문을 다시 읽고 더 어려운 설명을 찾았습니다.

첫 번째 발생과 동일한 줄에 발생하는지 여부에 관계없이 문서 전체에서 두 번째 발생하는 PATTERN을 REPLACMENT로 바꿉니다. 첫 번째와 세 번째 항목을 변경하지 않고 유지합니다. 등.

나는 이것이 훨씬 더 까다롭고 사용하려는 정규식에 따라 다르지만 Sed를 사용하여 이 작업을 수행할 수도 있다고 믿습니다. 문제 중 일부를 해결하고 게시하려고 노력할 것이지만 지금은 이 답변을 위의 간단한 버전과 일관되게 유지하겠습니다.

답변4

한 줄에 하나의 기호 패턴: sed 's/(a[^a]*)a/\1c/g'

다른 모든 패턴(한 줄에 하나의 패턴 일치만 발생할 수 있습니다. 한 줄에 두 개 이상의 일치가 발생하면 두 번째 패턴만 대체됩니다)

echo -e "test\nreplace_me\ntest\ntest\nreplace_me\nreplace_me\nreplace_me" | \
sed '/replace_me/{:a;N;/replace_me.*replace_me/!Ta;s/replace_me/replaced/2;}'

관련 정보