답변:
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
}; /$tail/p; d }" existing_file
r insert_file
명령은 행의 마지막 일이 될해야합니다. 참고 공백이나 의견이 모두 뒤에 허용됩니다. 이 코드는 옵션을 활성화 한 상태에서 GNU sed
를 사용하여 테스트 --posix
되었으며 예상대로 작동하므로 posix 와 호환sed
됩니다.
output=$(sed -e "..." existing_file)
한 다음 두 번째 단계 (예 echo "$output" > existing_file
:)로 교체를 수행하여 읽고있는 파일로 리디렉션하려고하면 내용을 읽기 전에 잘립니다.
경고 : 이것이 가장 간단한 방법은 아닙니다. (편집 : bash가 작동하고 POSIX grep도 좋습니다)
기본 텍스트가 "main"파일에 있고 생성 된 컨텐츠가 "gen"파일에 있으면 다음을 수행 할 수 있습니다.
#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main
main
고양이가 읽기 전에 그것을 쓰기 위해 열어 줄 것이라고 생각합니다 .
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
라고 말할 수 있습니다 r !command
.
sed
그냥 그 이상을 할 수 있습니다s/.../...
!