기본적으로 다음을 수행하는 구성 스크립트가 있습니다.
#!/bin/bash
source vars.sh
cat >foo.output <<EOF
# some static stuff (many lines...)
variable_bit=($SOME_VAR, $SOME_OTHER_VAR, ...)
# some more static stuff (many lines...)
EOF
foo.output.template
다음과 같은 다른 파일을 갖는 것이 더 나을 것입니다.
# some static stuff (many lines...)
VARIABLE_BIT
# some more static stuff (many lines...)
내 구성 스크립트는 다음과 같은 작업을 수행할 수 있습니다.
sed 's/VARIABLE_BIT/<<STDIN>>/' foo.output.template >foo.output <<EOF
variable_bit=($SOME_VAR, $SOME_OTHER_VAR, ...)
EOF
이것은 작동하지 않습니다. 이것이 가능한지는 모르겠지만 sed
목적은 다음과 같습니다.
- foo.output.template 읽기
- 성냥
VARIABLE_BIT
- 표준 입력의 다른 것으로 바꾸십시오.
- 그런 다음 foo.output으로 파이프하십시오.
sed
, awk
또는 이를 쉽게 수행할 수 있는 다른 일반적인 *nix 유틸리티가 있습니까?
답변1
적어도 GNU가 있다면 sed
,
$ cat foo.output.template
# some static stuff (many lines...)
VARIABLE_BIT
# some more static stuff (many lines...)
그리고
$ cat bar
hello
hello
VARIABLE_BIT
그런 다음 내용을 일치시키고 읽고 삽입 bar
한 다음 삭제할 수 있습니다 VARIABLE_BIT
.
$ cat bar | sed '/^VARIABLE_BIT/{
r /dev/stdin
d
}' foo.output.template
# some static stuff (many lines...)
hello
hello
# some more static stuff (many lines...)
d
파일 이름의 일부로 해석되지 않도록 주의한다면 이를 한 줄의 코드로 바꿀 수 있습니다.
cat bar | sed -e '/^VARIABLE_BIT/{r /dev/stdin' -e 'd;}' foo.output.template
일반적인 방법으로 출력 파일로 리디렉션합니다. 즉,> foo.output
cat bar
참고: 정말로 사용하고 싶다면 stdin을 설명 하겠습니다 .문서대체 텍스트의 경우 이 작업을 직접 수행할 수 있습니다.
sed -e '/^VARIABLE_BIT/{r bar' -e 'd;}' foo.output.template > foo.output
답변2
템플릿을 변수 섹션 앞과 변수 섹션 뒤에 하나씩 두 개의 파일로 나눌 수 없습니까? 그런 다음 쉘은 다음과 같이 연결할 수 있습니다.
( cat foo.output.template.before; cat ; cat foo.output.template.after; ) >foo.output
답변3
cat before.input - after.input >output <<EOF
whatever $FOO $BAR
EOF