【问题标题】:Replace multiple lines with a single用单行替换多行
【发布时间】:2020-11-11 17:30:06
【问题描述】:

我有一个文件,其中包含许多证书以及其他文本,如下所示。

blah blah blah
blah blah blah
-----BEGIN CERTIFICATE-----
asdqwejljlajlsjdlajdhlakshfaksf
ajsdlahlasd;ajdpjadsadaljdslasd
asdhashdkashdladlajdlakjsdakjdla
alksdjladlajdajd;ad;asldadalsdka
-----END CERTIFICATE------
asasd asdasd asdasd
blah blah blah
blah blah blah
-----BEGIN CERTIFICATE-----
asdasdalsdasdasdadsasda
asdasdadsasdadsasd
asdadadsadasd
asdasdadsadadasdasd
-----END CERTIFICATE-----

我想用全局文件中的 -----BEGIN CERTIFICATE 到 END CERTIFICATE----- 替换证书。

应该是这样的:

blah blah blah
blah blah blah
<removed-cert>
asasd asdasd asdasd
blah blah blah
blah blah blah
<removed-cert>

我使用了下面的命令,但我得到了错误

sed 's(/BEGIN/,/END/)/<removed-cert>/g' file_name
Error :: sed: -e expression #1, char 28: unterminated `s' command

有人可以帮忙吗?

【问题讨论】:

  • 你做了什么研究?

标签: unix sed


【解决方案1】:

如果要直接修改文件,可以使用ed

$ printf '%s\n' 'g/^--*BEGIN/.,/^--*END/c\' '<removed-cert>' w | ed -s input.txt 
$ cat input.txt
blah blah blah
blah blah blah
<removed-cert>
asasd asdasd asdasd
blah blah blah
blah blah blah
<removed-cert>

已翻译:对于以一个或多个破折号和单词 BEGIN 开头的每一行,c将区域从该行挂到下一行以一个或多个破折号开头,并带有单词 END 到 @987654323 @,最后w将更改的文件写回。

【讨论】:

    【解决方案2】:

    sed 主要不适用于换行符,处理多行选择的更好工具是awk

    awk '/-----BEGIN CERTIFICATE-----/ {f=1}
    f==1 {}
    f==0 {print}
    /-----END CERTIFICATE-----/ {f=0 ; print "<removed-cert>"}' file.txt
    

    【讨论】:

      猜你喜欢
      • 2014-07-03
      • 1970-01-01
      • 2014-03-11
      • 2019-04-16
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多