Sed : 두 번째 줄 바꿈마다 패턴을 바꾸시겠습니까?


10

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

답변:


6

참조 /programming/5858200/sed-replace-every-nth-occurrence를

이 솔루션은 sed 대신 awk를 사용하지만 "작업에 적합한 도구를 사용하십시오". sed에서는 가능 하거나 불가능할 수도 있지만 가능 하더라도 awk 또는 perl과 같은 도구 에서는 훨씬 쉬울 것입니다.


1
내가 배운 것을 사용하여 sed -e 'n;s/2004-2009/6e législature/g'문제를 해결 한 하녀 .
Matthieu Riegler

1
매 초마다받지 않습니다이 발생을 하여도 모든 초에 당신의 패턴을 검색합니다 라인 . 즉, 1, 3, 5, 7 등의 줄을 건너 뜁니다. 물론 특정 문서에서 여전히 작동 할 수 있습니다.
cas

그렇습니다. 그것이 실제로 필요한 것입니다.
Matthieu Riegler

14
sed 's/pattern/replacement/2'

패턴이있는 모든 행에서 두 번째 발생을 대체합니다.


GNU가 있다면 sed:

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

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


나는 두 번째를 원하지 않지만 매 초마다.
Matthieu Riegler

한 줄에 하나의 패턴이 있습니다. 작동하지 않습니다.
Matthieu Riegler

그 사실을 알게되어 기뻤습니다. 따라서 패턴은 1, 2, 3 및 4 번째 라인에서 발생하며 2, 4 등의 패턴을 바꾸시겠습니까?
llua

더 짧은 대안이있을 수있다 code( '1 ~ 2 초 / 패턴 / 대체 /')
jaap

2

간단한 해석 :

하나 이상의 PATTERN이 포함 된 첫 번째 행에서이를 무시하고 그대로 인쇄하십시오. PATTERN이 하나 이상 포함 된 두 번째 행에서 PATTERN의 첫 번째 인스턴스를 REPLACEMENT로 바꾸려고합니다. 하나 이상의 PATTERN이 포함 된 세 번째 줄에서 줄을 그대로 인쇄하려고합니다. 하나 이상의 PATTERN이 포함 된 네 번째 행에서 PATTERN의 첫 번째 인스턴스를 REPLACEMENT로 바꾸려고합니다. 등등. 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을 REPLACEMENT로 바꾸십시오 (첫 번째와 같은 줄에서 발생하는지 여부에 관계없이). 첫 번째와 세 번째 항목은 변경하지 마십시오. 기타.

나는 이것이 Sed로도 할 수 있다고 생각하지만, 훨씬 까다 롭고 사용되는 정규 표현식에 의존한다고 생각합니다. 나는 무언가를 해결하고 그것을 게시하려고 노력할 것이지만, 지금은이 답변이 위의 간단한 버전으로 세워지게 할 것입니다.


당신의 test를 quit로 바꾸고 , { sed '...'; cat; } <input단지 한 번의 교체를 위해 같은 입력을
받으십시오

1

당신은 매우 가까웠습니다. 첫 번째 줄을 건너 뛰십시오.

sed '1n;s/pattern/replacement/;n'

awk이 경우 왜 더 좋은 도구가 되어야 합니까?


0

한 줄 안에 하나의 심볼 패턴 : 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;}'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.