시퀀스와 함께 sed를 사용하는 방법

시퀀스와 함께 sed를 사용하는 방법

sed가 다음 스크립트를 병렬로 실행하는 것처럼 보이지만 순차적으로 실행하고 싶습니다.

printf '%s\n' aa bb cc dd | sed 's/bb/\nff/g;/^$/d'

이 sed 스크립트는 bb를 ff로 바꾸고 빈 줄을 제거하면서 줄 바꿈을 추가합니다.

개행 문자를 추가하고 방금 추가한 개행 문자를 제거하고 싶다고 가정해 보겠습니다.

답변1

sedsed일반적으로 파일은 한 번에 한 줄씩 처리되지만 줄 바꿈이 추가되면(또는 "패턴 공간"의 내용을 읽거나 추가하는 일부 명령이 사용되는 경우) 동시에 여러 줄을 포함할 수 있습니다 . 특히 sed스크립트가 " bb" 라인을 처리할 때 먼저 이를 " \nff"( \n실제 개행 문자를 나타냄)로 바꾼 다음 전체 패턴 공간을 regex 와 비교하여 ^$일치하지 않는 것을 찾아 명령을 무시합니다. (참고: 이 경우 ^및 는 $줄의 시작과 끝을 의미하는 것이 아니라 패턴 공간의 시작과 끝을 의미합니다.)

해결 방법: 목표를 올바르게 이해했다면 두 번째 테스트에서는 ^\n개행 문자( )로 시작하는 패턴 공간을 확인해야 하며, 그렇다면 개행 문자(아니요전체 패턴 공간). 를 교체하여 이를 수행할 수 있습니다 s/^\n//.

기본적으로 "bb" 패턴이 줄의 시작 부분에 있으면 개행 문자가 추가되지만 줄 끝에 있으면 줄 바꿈 문자가 추가되지 않습니다.

$ printf '%s\n' aa bb cc dd prefixbbsuffix | sed 's/bb/\nff/g;s/^\n//'
aa
ff
cc
dd
prefix
ffsuffix

또는 두 개의 별도 sed명령을 실행할 수 있으므로 두 번째 명령은 추가된 줄을 별도의 항목으로 처리하여 줄을 다시 만듭니다.

printf '%s\n' aa bb cc dd prefixbbsuffix | sed 's/bb/\nff/g' | sed '/^$/d'
aa
ff
cc
dd
prefix
ffsuffix

이것이 실제 목표가 아닌 경우 질문을 편집하여 명확하게 하십시오.

관련 정보