私のコード例
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