sed/awk/etc를 사용하여 파일의 일부를 표준 입력의 텍스트로 바꿀 수 있습니까?

sed/awk/etc를 사용하여 파일의 일부를 표준 입력의 텍스트로 바꿀 수 있습니까?

기본적으로 다음을 수행하는 구성 스크립트가 있습니다.

#!/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

관련 정보