在 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 脚本中捕获命名组的主要内容,如果未能解决你的问题,请参考以下文章