如何用文件内容替换行并用一些文本替换内容周围?

如何用文件内容替换行并用一些文本替换内容周围?

我想将 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,并且我想知道是否有任何命令可以将sr命令组合在一起?

我正在使用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-,pww somefileed

您可以与(类似,不会在模式空间上运行 - 与它不同)sed结合:raars

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

如果我正确理解你的问题,似乎可以使用rD例如的组合

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

相关内容