sed: 여러 줄 블록을 표준 입력으로 교체

sed: 여러 줄 블록을 표준 입력으로 교체

반면input_file:

1
2
START
foo
END
3

표적STARTinclude ... 블록 내의 내용을 ENDstdin의 여러 줄 내용으로 바꾸는 것입니다.

1
2
hello 
world
3

내가 시도한 것:

sed '/^START$/,/^END$/d;r /dev/stdin' input_file <<EOF 
hello
world
EOF

불행하게도 결과는

1
hello
world
2
3

r /dev/stdin순차적으로 호출되는 것 같아요뒤쪽에 /^START$/,/^END$/d;첫 번째 줄 뒤에만 추가합니다.

두 번째 시도:

sed '/^START$/,/^END$/{d;r /dev/stdin
}' input_file <<EOF     
hello
world
EOF

인쇄

1
2
3

위 명령(특히 마지막 명령)이 잘못된 결과를 인쇄하는 이유는 무엇입니까? 어떻게 조정하나요?

답변1

주소 범위는 첫 번째 시도에서만 작동합니다 d. (append r /dev/stdin...)가 첫 번째 줄에서 완료되면 파일의 끝을 만나게 됩니다. 두 번째 시도에서는 스크립트가 r명령을 발견하지 못했습니다. man sed:

  d      Delete pattern space.  Start next cycle.

따라서 d명령 이후의 모든 내용은 (해당 주소 범위 내에서) 손실됩니다 r /dev/stdin.

목표를 달성하려면 다음을 시도해 보세요.

sed -e '/^START$/,/^END$/ { r /dev/stdin' -e';d};' file3 <<EOF 
hello
world
EOF

1
2
hello
world
3

주소 범위가 충족되면 먼저 읽은 다음 주소 범위를 삭제합니다.

관련 정보