내 코드 예
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 -i
macOS에서는 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