【发布时间】:2019-04-30 05:50:59
【问题描述】:
以下代码是我为 Solarwinds 解析 Netbackup 命令输出的一小部分代码。这对我们的 Windows 机器来说很好,但我们的一些机器是 RHEL。
我正在尝试将以下代码转换为可在 RHEL 4.X 上使用的代码,但我在解析正则表达式时遇到了麻烦。显然,下面的代码有一些字符转义以用于 Powershell,我已经对这些字符进行了转义以用于 Shell。
我对 Shell 还不是很了解,但我会在 Powershell 代码下面发布我的一部分 Shell 代码。
$output = ./bpdbjobs
$Results = @()
$ColumnName = @()
foreach ($match in $OUTPUT) {
$matches = $null
$match -match "(?<jobID>\d+)?\s+(?<Type>(\b[^\d\W]+\b)|(\b[^\d\W]+\b\s+\b[^\d\W]+\b))?\s+(?<State>(Done)|(Active)|(\w+`-\w+`-\w+))?\s+(?<Status>\d+)?\s+(?<Policy>(\w+)|(\w+`_\w+)|(\w+`_\w+`_\w+))?\s+(?<Schedule>(\b[^\d\W]+\b\-\b[^\d\W]+\b)|(\-)|(\b[^\d\W]+\b))?\s+(?<Client>(\w+\.\w+\.\w+)|(\w+))?\s+(?<Dest_Media_Svr>(\w+\.\w+\.\w+)|(\w+))?\s+(?<Active_PID>\d+)?\s+(?<FATPipe>\b[^\d\W]+\b)?"
$Results+=$matches
}
以下是我编写的一小部分 Shell 代码(这显然是非常错误的,在这里边学习边学习)。我只是用它来测试正则表达式,看看它是否在 Shell 中起作用——(剧透警告)它没有。
#!/bin/bash
#
backups=bpdbjobs
results=()
for results in $backups; do
[[ $results =~ /(?<jobID>\d+)?\s+(?<Type>(\b[^\d\W]+\b)|(\b[^\d\W]+\b\s+\b[^\d\W]+\b))?\s+(?<State>(Done)|(Active)|(\w+\w+\-\w\-+))?\s+(?<Status>\d+)?\s+(?<Policy>(\w+)|(\w+\_\w+)|(\w+\_\w+\_\w+))?\s+(?<Schedule>(\b[^\d\W]+\b\-\b[^\d\W]+\b)|(\-)|(\b[^\d\W]+\b))?\s+(?<Client>(\w+\.\w+\.\w+)|(\w+))?\s+(?<Dest_Media_Svr>(\w+\.\w+\.\w+)|(\w+))?\s+(?<Active_PID>\d+)?/ ]]
done
$results
以下是我得到的错误。
./netbackupsolarwinds.sh: line 9: syntax error in conditional expression: unexpected token `('
./netbackupsolarwinds.sh: line 9: syntax error near `/(?'
./netbackupsolarwinds.sh: line 9: ` [[ $results =~ /(?<jobID>\d+)?\s+(?<Type>(\b[^\d\W]+\b)|(\b[^\d\W]+\b\s+\b[^\d\W]+\b))?\s+(?<State>(Done)|(Active)|(\w+\w+\-\w\-+))?\s+(?<Status>\d+)?\s+(?<Policy>(\w+)|(\w+\_\w+)|(\w+\_\w+\_\w+))?\s+(?<Schedule>(\b[^\d\W]+\b\-\b[^\d\W]+\b)|(\-)|(\b[^\d\W]+\b))?\s+(?<Client>(\w+\.\w+\.\w+)|(\w+))?\s+(?<Dest_Media_Svr>(\w+\.\w+\.\w+)|(\w+))?\s+(?<Active_PID>\d+)?/ ]]'
【问题讨论】:
-
您可能需要通过在其前面加上 \ 来转义某些特殊字符,例如 ( 或 ),因此如果我理解,它会知道通过将其写为 (Active) 来查找文本 (Active)你的正则表达式正确。
-
@JCJ Escaping
(将其含义从起始组更改为文字(。对我来说(工作得很好。 -
@JCJ 正如 Socowi 所说,没有一个括号是字面的,它们都表示正则表达式中的组。
-
@Djxinator 这是一个有趣的问题。但是,你应该把它煮沸。删除所有不必要的东西。您只需向我们展示核心问题。一行powershell代码,一行bash代码,报错信息就够了。
-
在 bash 中,将每一端的
/替换为单引号'- 这不是 PCRE!
标签: regex bash shell powershell