【问题标题】:sh script to get rid of block of text on multiple linessh脚本摆脱多行文本块
【发布时间】: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-----",但这显然没有像我希望的那样工作。

有什么建议吗?

【问题讨论】:

    标签: sed sh


    【解决方案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 有什么建议吗?

      【讨论】:

        猜你喜欢
        • 2015-02-27
        • 2022-08-09
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        相关资源
        最近更新 更多