반면예 input_file
:
1
2
START
foo
END
3
표적START
include ... 블록 내의 내용을 END
stdin의 여러 줄 내용으로 바꾸는 것입니다.
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
주소 범위가 충족되면 먼저 읽은 다음 주소 범위를 삭제합니다.