如何在bash中提取页眉和页脚之间的多行

如何在bash中提取页眉和页脚之间的多行,bash,awk,sed,Bash,Awk,Sed,如果我有一个包含以下字符串的bash变量: my signed 1.5 tag -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b hM1/PswpPLuBSr+oCIDj5GMC2r2iEKs

如果我有一个包含以下字符串的bash变量:

my signed 1.5 tag
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut
LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b
hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm
ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp
8S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi
RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
=EFTF
-----END PGP SIGNATURE-----

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number
我尝试了sed或awk的各种组合,但没有得到任何保留换行符的工作

sed-n'/-/,/-/{/-/n;/^Version/{n;n};p}'

在--行之间,使用n跳过不需要的行。否则,请打印它们

显然可以将正则表达式扩展得更严格一些。

使用bash参数扩展

signature=${string#*$'\n'-----BEGIN PGP SIGNATURE-----$'\n'}
signature=${signature#*$'\n\n'}
signature=${signature%%$'\n'-----END PGP SIGNATURE-----*}
第一个赋值将从字符串开头到由--BEGIN PGP SIGNATURE--组成的行的部分删除。第二个将零件移到第一个空行。第三个将从--END PGP签名--到字符串末尾的部分删除。剩下的字符串是base64签名

回答中使用的参数展开形式说明: ${varpattern}替换为变量var的内容,如果该模式匹配变量var内容的前导部分,则从开头删除最短的匹配模式。 ${var%%pattern}由变量var的内容替换,如果该模式与变量var内容的尾部匹配,则从末尾删除最长的匹配模式。
有关所有形式的bash参数扩展的详细信息,请阅读。

假设签名周围始终存在空行:

awk-v RS='sub/\n---END PGP签名---/,{print;exit}' -v RS=段落模式,记录分隔符将是两个或多个连续的换行符 sub/\n---结束PGP签名---/,如果此替换成功 打印退出打印修改后的记录并退出 \n用于替换,因为默认的ORS是换行符 假设bash变量str包含上述字符串,请尝试:

pat=$'-----BEGIN PGP SIGNATURE-----\n.*\n\n([^-]+)\n-----END PGP SIGNATURE-----'
if [[ $str =~ $pat ]]; then
    signature=${BASH_REMATCH[1]}
    echo "$signature"
fi

建议:我尝试了sed或awk的各种组合,在问题中添加了一些代码以避免否决/关闭。这非常有效,谢谢!为了让答案更完美,你能解释一下你在这些电话中使用的不同符号吗?@matthias_buehlmann补充道。
pat=$'-----BEGIN PGP SIGNATURE-----\n.*\n\n([^-]+)\n-----END PGP SIGNATURE-----'
if [[ $str =~ $pat ]]; then
    signature=${BASH_REMATCH[1]}
    echo "$signature"
fi