【问题标题】:Capture Named Group in Shell Script在 Shell 脚本中捕获命名组
【发布时间】: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。

标签: regex bash shell scripting


【解决方案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 中格式化输出。有什么特别的想法吗?
  • 还有其他问题吗?愿意接受答案吗?
猜你喜欢
  • 2014-10-21
  • 2017-03-08
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多