여러 줄 변수가 있는 쉘 스크립트에서 sed 사용

여러 줄 변수가 있는 쉘 스크립트에서 sed 사용

저는 쉘 스크립트를 사용하여 다양한 유형의 가상 머신을 설정합니다. 이러한 스크립트에는 sed.

이렇게 만들면 모든 것이 괜찮습니다.

VAR="Config Line1\nConfig Line2\nConfig Line 3"
sed -i "/MatchingPattern/ a $VAR" somefile

그러나 특히 텍스트 블록이 상당히 길 수 있기 때문에 스크립트를 읽기 쉽게 만들지는 못합니다.

내가 이렇게 쓴다면:

VAR="Config Line1
Config Line2
Config Line 3"
sed -i "/MatchingPattern/ a $VAR" somefile

스크립트를 실행하는 중 오류가 발생했습니다: sed: -e expression #1, char 31: unknown command:C'`

sed이렇게 선언된 변수를 사용할 수 있는 방법이 있나요 ?

답변1

이 명령의 표준 구문은 다음 a과 같습니다.

sed -e 'a\
first line\
  second line\
last line'

BSD(최소 FreeBSD 및 OS/X)는 sed선행 공백을 제거합니다., 그리고-e버그를 수정 해야 합니다. GNU에서는 첫 번째 줄이 비어 있지 않은 한 sed오른쪽 뒤로 첫 번째 줄을 이동할 수 있습니다 .a\

따라서 입력을 전처리해야 합니다.

VAR='content with
multiple lines
  some with lead blanks
or even backslash\'

preprocessed_VAR=$(printf '%s\n' "$VAR" |
  sed 's/\\/&&/g;s/^[[:blank:]]/\\&/;s/$/\\/')

sed -i -e "/MatchingPattern/a\\
${preprocessed_VAR%?}" somefile

FreeBSD 또는 OS/X에서는 ( -i로 대체) -i ''.

GNU/Linux에서 GNU 쉘( bash) 또는 을 사용하여 zsh다음을 수행할 수 있습니다.

sed -i '/MatchingPattern/r /dev/stdin' <<< "$VAR"

bash이는 here-strings가 삭제된 임시 파일을 사용하여 구현되고 Linux의 /dev/stdin이 파일에 대한 심볼릭 링크로 구현되기 때문에 작동합니다 zsh. 즉, 여러 번 열 수 있고 처음 열 때마다 매번 열 수 있습니다.

여기에서는 대신 GNU를 사용할 수도 있습니다 awk.

(export VAR
gawk -i /usr/share/awk/inplace.awk '{print}; /MatchingPattern/{print ENVIRON["VAR"]}' somefile)

사용하지 마세요-i inplace현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

또는 perl( -i어디에서 왔는지):

(export VAR
perl -pi -e '$_ .= "$ENV{VAR}\n" if /MatchingPattern/' somefile)

답변2

이 오류는 실제 뒤에 백슬래시가 필요한 sed추가 명령 으로 인해 발생합니다 .aa

GNU 사용 sed:

$ sed "/pattern/a\\$VAR" file.in >file.out

내가 아는 한, BSD는 개행 문자가 올바르게 이스케이프되지 않는 한 sed파일에 줄을 삽입하기 위해 이 명령만 사용할 수 있습니다 .a

BSD를 사용하여 이 문제를 해결하는 방법에 대한 밀접하게 관련된 답변은 다음과 같습니다 sed.http://unix.stackexchange.com/a/60322

관련 정보