내 스크립트는 네 번째 줄 뒤에 일부 설정을 변수에 저장된 텍스트 블록으로 삽입하여 구성 파일을 수정합니다. MacOS 버전의 sed와 일부 비호환성이 있다는 것을 알고 있어서 GNU 버전을 설치했는데 어떤 SED가 실행되고 있는지 모르겠습니다.
#!/bin/bash
SCRIPT_LINES="모든 "vars"에 대해;\find 런타임("stm32")은 "c++"를 사용합니다.\n\n" sed -i'' "4i$SCRIPT_LINES"environment.cfg
SED의 구문은 의미가 없으며 대안이 있기를 바랐지만 좋은 대안은 없는 것 같습니다. bash 스크립트의 변수에 포함된 텍스트 블록을 다른 파일에 삽입하는 방법은 무엇입니까?
답변1
sed의 구문이 의미가 없다고 판단되면 다양한 방법으로 특정 위치에 줄을 삽입할 수 있습니다. 매우 이해하기 쉬운 방법:
( head -n 4 environment.cfg && echo "$script_lines" && tail -n +5 environment.cfg ) > /tmp/tmp-environment.cfg
mv /tmp/tmp-environment.cfg environment.cfg
즉, 파일의 처음 네 줄을 에코한 다음 변수를 에코하고 라인 5부터 시작하는 모든 내용을 인쇄합니다. 결과를 임시 파일에 저장하고 복사하세요.
이것은 피할 수 있습니다 sed
. ☺
하지만 내 생각에 GNU sed에서는 이것이 단지
sed -i "4a $script_lines" environment.cfg
OS X sed의 경우:
sed -i '' "4a $script_lines" environment.cfg
실행 중인 버전을 확인하려면 다음을 수행하세요.
sed --version
답변2
대신 다음을 사용할 수 있습니다( 일부 구현에서 호환되지 않는 방식으로 추가하는 perl
비표준 확장에서 영감을 얻음 ).-i
sed
perl
#! /bin/sh -
SCRIPT_LINES='for all "vars";find Runtime ("stm32") use "c++"
' perl -i -pe '$_ = "$ENV{SCRIPT_LINES}$_" if $. == 4' environment.cfg