【问题标题】:Store perl regex capture groups in bash variables将 perl 正则表达式捕获组存储在 bash 变量中
【发布时间】:2021-08-06 18:14:48
【问题描述】:

我正在编写一个小 bash 脚本来通过我们的 api 获取某些硬件的状态。

curl -sG ip:port/device/status -o temp.txt

我使用 curl 命令获取状态并写入临时文件

我尝试了不同的正则表达式类型,简单的 bash 正则表达式还不够,最终使用了 perl。

perl -nle 'printf("'%-15s' \t '%-15s' \t '%-15s' \t '%-15s' \n", "$1", "$2", "$3", "$4") while m{regex_to_capture_data}g' temp.txt

我的正则表达式捕获正在工作并且打印出来很完美(一些迭代将有空白捕获组,这是重要信息,并且按预期打印)

有没有办法让数组填充这些捕获组并在我的 bash 脚本中进一步使用它们?

例如 $1、$2、$3、$4 是字段 device_id、uptime、status、last_error。在我的 curl 命令中,我有 4 个设备的信息。我希望将 device_id[0] 设置为 [device_id[3],并且每个捕获组都相同。

我没有使用 perl 的经验,只是按照一些论坛帖子的建议使用它,因此非常感谢任何有关如何实现这一点的建议。

【问题讨论】:

  • 你能像这样包装你在帖子中的整个 perl 命令吗:bash_var=$( perl command )
  • 你在 bash 中所做的一切都可以在 perl 中完成,为什么要切换语言?或者展示您在 bash 中尝试过的内容,我们可以提供帮助。 regex101.com 等工具也可以提供帮助。在最坏的情况下,如果必须,可以使用$(perl ...) 执行 perl 命令,并将输出添加到 bash 变量中。请接tourHow to Ask
  • @mattb 将所有设备的全部输出放在一个变量中
  • @Nic3500 谢谢,我确实使用了 regex101,我遇到的问题是我在 regex101 中创建的正则表达式在 bash 正则表达式中不起作用,因为我使用了不受支持的惰性匹配,所以使用 perl 作为一种解决方法。

标签: regex bash perl


【解决方案1】:

您的示例代码显然已损坏;你不能嵌套单引号;尽管 Perl 提供了方便的运算符q(),所以您可以轻松地解决这个问题。格式也有其他错误。可能你的意思是像

perl -nle 'print(join("\t", "$1", "$2", "$3, "$4"), "\n") while m{regex_to_capture_data}g' temp.txt

你可以把它传送到

while IFS=$'\t' read -r boulders rubble stones rocks; do
    ...

虽然您也可以直接从 Perl 运行该循环的主体。

perl -nle 'system("geologee", "--boulders", $1, "--rubbleUrl", "$2:$3/$4") while m{regex_to_capture_data}g' temp.txt

【讨论】:

  • 嗯,这很奇怪,因为该代码在我的 mac 和 linux 机器上运行良好,没有任何格式错误,但您的 print join 命令看起来更整洁,并帮助我完成了下一步。你的 IFS 正是我想要的!非常感谢!我尝试了类似的方法,但没有在进程替换 中传递命令
  • 代码很奇怪,但不是因为它是正确的。您在单引号字符串之间插入文字空间、反斜杠、t 和空格,而 Perl 足够宽松,可以让您这样做。
  • 啊,谢谢你的建议。在您的帮助下,现在一切正常,非常感谢:D
  • 只是一个后续问题,如果你不介意我问的话。我有那个 perl 表达式像你展示的那样被输送到一个 while 循环中。例如,如果说我有一个只有 1 美元和 4 美元的条目,目前它将 1 美元分配给“巨石”,将 4 美元分配给“瓦砾”,而对我来说重要的是要知道“瓦砾”和“石头”是空的,并且有 4 美元分配给岩石。您知道如何在当前设置中实现这一点吗?
  • 也许您可以重新排序字段,以便可能未定义的字段始终排在最后?或者,如果可以,请使用不同的分隔符(请参阅ideone.com/HnqoeZ)。或者可能输出一个特定的占位符值,如-null,并在循环内替换它,如"${rubble#null}"。最终,如果您需要它完全通用,那么使用 system 从 Perl 内部运行某些东西可能是最可持续的解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 2021-09-06
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多