我想将 VPN 证书合并到一个文件中。这是一个模板文件:
# 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'
虽然这个脚本工作正常,但我必须将另外两个文件与 一起粘贴ca.crt
,并且我想知道是否有任何命令可以将s
和r
命令组合在一起?
我正在使用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
这会改变一行
tag tag.extension
到
<tag>
</tag>
然后写入before ( ) 结束标记行(即替换后的当前行)r
的内容。替换为实际将更改写入模板文件(或用于将更改保存到另一个文件)。请记住,如果未找到模式,则会出错。tag.extension
-
,p
w
w somefile
ed
您可以与(类似,不会在模式空间上运行 - 与它不同)sed
结合:r
a
a
r
s
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
使用 GNU sed
,假设这些 ca 文件名不包含单引号字符,您可以这样做:
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