如何在 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 '(?&lt;=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 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

shell编程之正则表达式与文本处理器

如何在 Notepad++ 的 Python 脚本中将变量设置为正则表达式字符串?

Shell脚本——正则表达式

shell脚本之正则表达式

shell脚本——正则表达式Sed与Awk文本处理工具详解

如何在 linux shell 脚本中使用正则表达式搜索文件 [关闭]