sh脚本摆脱多行文本块

Posted

技术标签:

【中文标题】sh脚本摆脱多行文本块【英文标题】:sh script to get rid of block of text on multiple lines 【发布时间】:2021-10-24 02:05:02 【问题描述】:

也许有人问过这个问题,但我似乎找不到它,但问题是我想摆脱一段文本(或任何时候它出现在文件中),并将其替换为任何内容.该示例是解码证书并删除包属性,其中文本块在开始和结束文本之间可能略有不同,但它们始终以相同的开头并以我想要保留的行结束:

例如 该文件将包含如下文本,并且在使用链式证书时可能有多个实例:

包属性 localKeyID:xx 00 yy 00 友好名称:something.domain.com subject=/serialNumber=公司实体/jurisdictionCountryName=US /jurisdictionStateOrProvinceName=华盛顿/businessCategory=公司实体/C=US /ST=华盛顿/L=西雅图/O=Bobs Place/OU=Bobs/CN=something.domain.com issuer=/C=GB/O=GoDaddy/CN=GoDaddy 证书 -----开始证书-----

我希望能够查找以“Bag Attributes”开头并以包含“-----BEGIN CERTIFICATE-----”的行结尾的模式,并删除“-”之前的所有行----BEGIN CERTIFICATE-----"(仅斜体文本)。当它们被链接时,以前的证书条目以“-----END CERTIFICATE-----”结尾,所以我不想回到文件的开头或这么多行,我真的想要从“Bag Attributes”行开始,到下一个“-----BEGIN CERTIFICATE-----”字符串之前的行结束。

我尝试了以下,但只成功删除了所有内容,而不仅仅是我想要的行:

sed -i -ne '/包属性/ p; r $CertName.pem' -e ':a; n; /-----开始证书-----/ p;乙;巴; p' "-----开始证书-----"

这应该获取文件“$CertName.pem”并通过“-----BEGIN CERTIFICATE-----”行查找以“Bag Attributes”开头的所有内容,然后将其替换为“ -----BEGIN CERTIFICATE-----",但这显然没有像我希望的那样工作。

有什么建议吗?

【问题讨论】:

【参考方案1】:

awk 很容易:

awk '
  /-----BEGIN CERTIFICATE----/ pr=0
  /Bag Attributes/ pr=1
  pr==0 print
' file

使用sed,您可以:

 sed 's/-----BEGIN CERTIFICATE----/\r/' file |
    sed -rz 's/Bag Attributes[^\r]*\r/-----BEGIN CERTIFICATE----/g'

【讨论】:

【参考方案2】:

我通过以下方法解决了这个问题,但现在还有一个问题。

彻底摆脱包属性的工作线:

sed -ne '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' $CertName.pem > $CertName.tmp1

现在我还要删除证书链中的一个条目,那么如何将上面的行反转并查找以两行结尾的两行字符串,然后修剪掉该信息块?:

例如寻找模式 -----开始证书----- abxdrfg12765 通过 oyrntlklkdn -----结束证书-----

像下面这个例子一样查找和删除斜体文本:

-----开始证书----- acbdef123456 mlkhdsftonnl ljhfnodvlndv qpiuekjnxvsn lmnopqr43210 -----结束证书----- -----开始证书----- abxdrfg12765 mlkhdsftonnl ljhfnodvlndv qpiuekjnxvsn oyrntlklkdn -----结束证书----- -----开始证书----- xyzabc543211 mlkhdsftonnl ljhfnodvlndv qpiuekjnxvsn lmnopqr43210 -----结束证书-----

斜体上面和下面的两块文字有不同的模式,但是第一块总是无法预测,第二块和第三块文字可能会互换,所以我又找不到了n向下或向上行并删除那些,所以我必须再次寻找多行模式并删除该文本块,但由于 SED 在多行文本方面做得不好,我将如何进行这种类型的解析和删除?

对问题 2 有什么建议吗?

【讨论】:

以上是关于sh脚本摆脱多行文本块的主要内容,如果未能解决你的问题,请参考以下文章

多行shell脚本如何执行?

sh 这是一个try / catch块,使调试脚本更容易制作。

如何停止多行不应在 Shell 脚本中返回

sh 我使用此脚本来备份我的QEMU / KVM / libVirt虚拟机。该脚本需要KVM 2.1+,因为它使用实时块提交模式。这个

Shell脚本单行和多行注释

如何使用来自 Java 文本字段的用户输入运行 .sh 脚本?