我有一个文件
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>
];
这可能对你有用(GNU sed):
sed -E '/= \[/{:a;N;/\];/!ba;s/(= \[). replacementFile)\2/;s/.*/echo "&"/e}' file
搜索某个部分的开头,然后收集更多行,直到该部分的末尾。
使用替换命令在方括号内替换为 shell 命令以捕获整个替换文件。
使用替换命令和
e
标志将模式空间的全部内容替换为 echo 命令,该命令在评估时将输出所需的结果。