파일의 문자열 뒤에 cli 매개변수를 사용하는 가변 텍스트를 삽입하는 방법은 무엇입니까?

파일의 문자열 뒤에 cli 매개변수를 사용하는 가변 텍스트를 삽입하는 방법은 무엇입니까?

내 코드 예

var='
    content="
            line1:'$1'
            line2:'$2'
            "
    for lines in ${content[@]}
    do
      echo print $lines
    done
    '

파일의 특정 문자열 뒤에 위 내용을 삽입하고 싶습니다.

다음 명령을 사용하고 있지만 파일에 문자열만 삽입하기 때문에 작동하지 않습니다.

내가 노력하는 것 :

sed -i '/pattern/a\ Hello world' destination.sh

내가 원하는 방식:

sed -i '/pattern/a\ '`echo "$var"`'' destination.sh

답변1

텍스트만 삽입하면 된다고 가정해 보겠습니다.한 번, a여기서는 편집 명령을 사용 하지 않고 r파일에서 읽습니다.

cat <<END_CODE | sed '/pattern/r /dev/stdin' destination.sh
content=( line1:${1@Q} line2:${2@Q} )

for lines in "\${content[@]}"; do
    echo print "\$lines"
done

# Above loop shorter: printf 'print %s\n' "\${content[@]}"
END_CODE

$1(삽입된 코드에서 및 $2가 확장되어야 하고 삽입된 코드를 실행하기 전에 다른 변수가 확장되어서는 안 된다는 가정 하에 텍스트 블록의 수정된 셸 코드를 기록해 두십시오 .)

var또는 변수를 유지하려는 경우 :

printf '%s\n' "$var" | sed '/pattern/r /dev/stdin' destination.sh

코드를 여러 번 삽입해야 하는 경우 실제 파일에 텍스트를 쓰고 r같은 방식으로 파일을 읽습니다.

sed '/pattern/r mycode' destination.sh

sed코드의 문제는 작은따옴표로 묶인 문자열인 편집 코드 에 변수 값을 삽입하려고 한다는 것입니다 . 변수는 작은따옴표로 묶인 문자열 내에서 확장되지 않습니다. 큰따옴표를 사용하도록 전환할 수 있지만 삽입된 데이터가 편집 스크립트의 구문을 위반하지 않는지 확인해야 하는 문제가 있습니다(예: 마지막 줄을 제외한 줄이 끝나지 않는 경우 \). . 그래서 r대신 사용하는 것이 더 안전하고 편리합니다 a.

macOS를 사용하는 경우 bash시스템을 기본 기본 버전에서 최신 버전으로 업그레이드해야 합니다. 당신은 이것을 할 수 있습니다홈브루 패키지 관리자. 또한 sed -imacOS에서는 Linux 등에서와 다르게 작동한다는 점에 유의하세요.sed -i(제자리에서 편집)를 사용하여 이식성을 달성하는 방법은 무엇입니까?).

답변2

임시 파일과 함께 here-doc를 사용하십시오.

cat > tmp.txt << EOF
    content="
            line1:'\$1'
            line2:'\$2'
            "
    for lines in \${content[@]}
    do
      echo print \$lines
    done
EOF

sed "/pattern/r tmp.txt" file
rm tmp.txt

관련 정보