使用 sed 将多行模式替换为文件内容

问题描述 投票:0回答:1

我有一个文件

certs.txt
包含具有多行模式的部分,例如

  CAChain = [IIH1zCCBr+gAwIBAgISBPW9KTc3ma4BJ5Dwjsap3vuSMA0GCSqGSIb3DQEBCwUAMDMxCzAJ
BgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQDEwNSMTEwHhcNMjQw
OTE4MDE0MjE5WhcNMjQxMjE3MDE0MjE4WjAWMRQwEgYDVQQDEwt3ZXJrd2VsdC5kZTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ09pgyz+iRHeuckR92soEwaN7/WzGIigdQV
...
...
x3bn
];

每个部分都可以通过

sed "s/= \[[^\]]*\];/= [/" 
来识别,但我的搜索不会跨线。

目标是取代

CAChain = [IIH1zCCBr+gAwIBAgISBPW9KTc3ma4BJ5Dwjsap3vuSMA0GCSqGSIb3DQEBCwUAMDMxCzAJ
BgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQDEwNSMTEwHhcNMjQw
OTE4MDE0MjE5WhcNMjQxMjE3MDE0MjE4WjAWMRQwEgYDVQQDEwt3ZXJrd2VsdC5kZTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ09pgyz+iRHeuckR92soEwaN7/WzGIigdQV
...
...
x3bn];

CAChain = [ <contents of file> 
];
sed pattern-matching multiline
1个回答
0
投票

这可能对你有用(GNU sed):

sed -E '/= \[/{:a;N;/\];/!ba;s/(= \[). replacementFile)\2/;s/.*/echo "&"/e}' file

搜索某个部分的开头,然后收集更多行,直到该部分的末尾。

使用替换命令在方括号内替换为 shell 命令以捕获整个替换文件。

使用替换命令和

e
标志将模式空间的全部内容替换为 echo 命令,该命令在评估时将输出所需的结果。

© www.soinside.com 2019 - 2024. All rights reserved.