저는 쉘 스크립트를 사용하여 다양한 유형의 가상 머신을 설정합니다. 이러한 스크립트에는 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
로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
또는 perl
( -i
어디에서 왔는지):
(export VAR
perl -pi -e '$_ .= "$ENV{VAR}\n" if /MatchingPattern/' somefile)
답변2
이 오류는 실제 뒤에 백슬래시가 필요한 sed
추가 명령 으로 인해 발생합니다 .a
a
GNU 사용 sed
:
$ sed "/pattern/a\\$VAR" file.in >file.out
내가 아는 한, BSD는 개행 문자가 올바르게 이스케이프되지 않는 한 sed
파일에 줄을 삽입하기 위해 이 명령만 사용할 수 있습니다 .a
BSD를 사용하여 이 문제를 해결하는 방법에 대한 밀접하게 관련된 답변은 다음과 같습니다 sed
.http://unix.stackexchange.com/a/60322