1行をファイルの内容に置き換え、その周囲の内容をいくつかのテキストに置き換えるには?

1行をファイルの内容に置き換え、その周囲の内容をいくつかのテキストに置き換えるには?

VPN証明書を1つのファイルにまとめたいです。以下はテンプレートファイルです。

# some unrelated stuff 

ca ca.crt

# other unrelated stuff

私はその行を次のように変更したいと思いますca ca.crt

<ca>
# ca.crt contents
</ca>

私は次のスクリプトを試しました。

cat client-template.ovpn | 
sed -e 's/ca ca.crt/<ca>\n<\/ca>/' | 
sed -e '/<ca>/r ca.crt'

このスクリプトはうまく機能しますが、2つの異なるファイルをandと貼り付ける必要がありますca.crtsr

私はこれを使用していますが、sed他のUnixツールへの答えは大歓迎です。

答え1

グッドオールドとed

ed -s client-template.ovpn <<\IN
/ca ca.crt/s//<ca>\
<\/ca>/
- r ca.crt
/cert client.crt/s//<cert>\
<\/cert>/
- r client.crt
/key client.key/s//<key>\
<\/key>/
- r client.key
,p
q
IN

これにより、1行が変更されます。

tag tag.extension

到着

<tag>
</tag>

次に、()終了バーの前(つまり、交換後の現在の行)の内容を作成しますr。実際、変更をテンプレートファイルに書き込むことで置き換えられます(または変更を別のファイルに保存するため)。パターンが見つからないとエラーが発生しますのでご注意ください。tag.extension-,pww somefileed

これを次のように組み合わせることができます(似ていますが、パターン空間では機能しません。 - これとは異なります)sedraars

sed '
/ca ca.crt/{
s//<ca>/
r ca.crt
a\
</ca>
}
/cert client.crt/{
s//<cert>/
r client.crt
a\
</cert>
}
/key client.key/{
s//<key>/
r client.key
a\
</key>
}
' client-template.ovpn

答え2

sedCAファイル名に一重引用符文字が含まれていないとし、GNUを使用すると、次のことができます。

sed "s|^ca \(.*\)|echo '<ca>'; cat '\1'; echo '</ca>'|e"

答え3

この問題については、sedを使用せずにこのスレッドで述べた方法を使用します。https://serverfault.com/questions/287688/templated-with-linux-in-a-shell-script

アイデアは、bash自体をテンプレート言語として使用して、テンプレートにファイルを含めるなどの操作を簡単に実行できることです。

したがって、テンプレートはファイルを生成するために実行するbashスクリプトになります。これを問題に適用すると、次のようになります。

make-client.sh:

#!/bin/bash

cat <<-EOF
# some unrelated stuff

<ca>
$(cat ca.crt)
</ca>

<other>
$(cat other.file)
</other>

# other unrelated stuff
EOF

コマンドラインでの使用法:

$ make-client.sh > client.ovpn

答え4

あなたの質問を正しく理解したら、r次のD組み合わせを使用することが可能です。

sed '/^ca ca.crt/ {
r new-content-file
D
}' client-template.ovpn

関連情報