如何编写Shell脚本删除证书文件中Bag Attributes到证书起始行的文本块
证书文件批量删除Bag Attributes块的实现方案
正确sed命令
# Linux 环境使用 sed -i '/Bag Attributes/,/-----BEGIN CERTIFICATE-----/{ /-----BEGIN CERTIFICATE-----/!d; }' "$CertName.pem" # macOS 环境使用(sed 语法差异要求-i后指定备份后缀,此处用空后缀表示不生成备份文件) sed -i '' '/Bag Attributes/,/-----BEGIN CERTIFICATE-----/{ /-----BEGIN CERTIFICATE-----/!d; }' "$CertName.pem"
命令逻辑说明
- 用sed的范围匹配规则,匹配所有从
Bag Attributes开头的行到下一个-----BEGIN CERTIFICATE-----行的闭合区间 - 对区间内的所有行做判断:如果不是
-----BEGIN CERTIFICATE-----行就删除,仅保留证书起始行,完全覆盖证书链中多个重复Bag Attributes块的处理场景
原命令错误原因
- 单引号包裹的内容中
$CertName.pem变量无法正常展开 - 命令末尾多传入了
"-----BEGIN CERTIFICATE-----"参数,被sed识别为待处理的文件名,文件不存在时无输出直接清空原文件 r读取文件的逻辑完全不符合当前区间删除的需求
备选awk实现(兼容性更好,跨平台通用)
awk '/Bag Attributes/{f=1} f && /-----BEGIN CERTIFICATE-----/{f=0} !f' "$CertName.pem" > tmp_cert && mv tmp_cert "$CertName.pem"
操作注意事项
- 处理前建议先备份原证书文件:
cp "$CertName.pem" "$CertName.pem.bak",避免操作失误丢失数据 - 变量名如果包含空格或特殊字符,必须用双引号包裹避免解析错误
内容的提问来源于stack exchange,提问作者Danielle Mccormick
相关产品推荐
相关产品推荐

