如何在 shell 脚本中将此正则表达式与 grep 一起使用?
Posted
技术标签:
【中文标题】如何在 shell 脚本中将此正则表达式与 grep 一起使用?【英文标题】:How to use this regex with grep in shell script? 【发布时间】:2022-01-14 00:16:01 【问题描述】:我需要在 shell 脚本中提取公钥,不知道如何使用它。我是 shell 脚本的新手。 https://regex101.com/r/SXDEaU/1
文件内容:
public_key=#STARTKEY#<public key base64 encoded>#ENDKEY#
正则表达式:/public_key=#STARTKEY#(.*)#ENDKEY#/s
由于key是base64编码的,所以是多行字符串。
期望的输出:
【问题讨论】:
请将该示例输入的所需输出(无描述、无图像、无链接)添加到您的问题(无评论)。grep -Pzo '(?<=public_key=#STARTKEY#)[\s\S]*(?=#ENDKEY#)' file
?
【参考方案1】:
perl -M5.010 -0777ne'say for /public_key=#STARTKEY#(.*?)#ENDKEY#/s' file
密钥是-0777
,它将整个文件作为一行读入。
【讨论】:
我会使用([^#]*)
而不是(.*)
,然后从匹配项中删除所有非base64字符(如换行符)
@Fravadona,我没有看模式;我只是展示了如何按要求使用它。 [^#]*
不正确,应该是 (?:(?!#ENDKEY#).)*
。但是.*?
在这里也可以,而且会比.*
更好。调整答案。 /// 不要求去除非 base64 字符,并不总是可取的,并且在不知道正在使用哪种 base64 风格的情况下无法完成。
哦是的,perl当然有非贪心*
【参考方案2】:
使用awk
使用其RS
变量并将其设置为段落模式,请尝试以下代码。
awk -v RS= 'match($0,/public_key=#STARTKEY#.*#ENDKEY#/)print substr($0,RSTART+21,RLENGTH-29)' Input_file
【讨论】:
不支持空行。但在允许的情况下,一个人极不可能遇到任何问题。所以这可能不是问题。以上是关于如何在 shell 脚本中将此正则表达式与 grep 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章