在 Shell 脚本中捕获命名组

Posted

技术标签:

【中文标题】在 Shell 脚本中捕获命名组【英文标题】:Capture Named Group in Shell Script 【发布时间】:2021-05-16 06:29:20 【问题描述】:

我需要在 shell 脚本中捕获命名组,类似于我们在 python 中的设置,如下所示:

(?P<year>.*)~(?P<name>.*)
1983~Harman

它确实捕获了 1983 年并命名为 Harman。 我阅读了有关使用 sed 和 awk 命令捕获组而不是命名组的信息,但我正在寻找 shell 脚本中的命名组捕获,任何线索将不胜感激。

【问题讨论】:

Perl、Ruby、Python 等中的正则表达式库支持命名捕获组。 @WiktorStribiżew,我们在 shell 脚本中没有这样的规定吗?或者您是否介意建议在 shell 脚本中捕获命名组的任何替代方法。 POSIX 正则表达式不支持命名捕获组。 捕获未命名的组?我看不出命名组不仅仅是一种方便。 [[ "1983~Harman" =~ (.*)~(.*) ]]; 1983 和 Harmon 将分别是 BASH_REMATCH 数组的索引 1 和 2。 【参考方案1】:

您可以在 shell 脚本中使用 perl 单行代码:

$ echo "1983~Harman" | perl -pe '/(?<year>.*)~(?<name>.*)/; $_ = "Name: $+name, Year: $+year\n"'
Name: Harman, Year: 1983

注意,命名捕获组需要 perl 5.10

【讨论】:

@Harmandeep Singh Kalsi:这符合您的需求吗?有什么问题吗? 字符串可以是任何东西,这只是我拿的样本。我们可以用一些通用的方式来做吗? 这取决于您在 perl 中使用什么管道,在 perl 中应用什么正则表达式,以及如何在 perl 中格式化输出。有什么特别的想法吗? 还有其他问题吗?愿意接受答案吗?

以上是关于在 Shell 脚本中捕获命名组的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby gsub 块中使用命名的捕获组(正则表达式)

如何在 shell 脚本中捕获 Gradle 退出代码?

如何在 Shell 脚本的变量中捕获 telnet 命令的输出

使用 re.findall 在正则表达式中捕获命名组

在c ++中捕获shell脚本退出状态[重复]

如何在 Shell 脚本中建立远程连接时捕获错误