如何从使用 `grep -P` 转换为 `grep -E`?
How do I convert from using `grep -P` to `grep -E`?
我有一个在 Ubuntu (Linux) 上使用的脚本,我想将其转换为在 Ubuntu (Linux) 上使用和 MacOS X。Linux 上的 grep
不同于 FreeBSD(即 MacOS X)上的 grep
; grep
在 MacOS X 上不支持 -P
选项。不幸的是,在两个平台上使用 -E
选项不会给出相同的结果。考虑以下适用于 Linux 的代码:
wip_scenarios=$(grep -oP "^\d+ scenarios?" log/report.log | grep -oP "\d+")
echo "\n"
echo $wip_scenarios
这个 returns 一个 0
在 Linux 上。将所有 -P
替换为 -E
可以在 MacOS X 上运行,但在 Linux 上,这只是 returns 一个 null
,对其余部分没有帮助当我使用这样的条件时我的脚本:
if [ $wip_scenarios != 0 ];then
一个解决方案是在前面放一个标志并根据平台使用适当的选项集,但我希望有一个跨平台的解决方案。有办法吗?
对于您在此处提供的正则表达式,这很简单:将 \d
更改为 [[:digit:]]
。
因此:
wip_scenarios=$(grep -Eo '^[[:digit:]]+ scenarios[?]' <report.log | grep -Eo '[[:digit:]]+')
如果您的脚本以 #!/bin/bash
开头(因此只会是 运行 和 bash
),我还会考虑跳过对非标准扩展的依赖 grep -o
,而是根据 bash 本身来分离出您关心的数字:
# This works with any POSIX-compliant grep, but requires that the shell be bash
wip_scenarios_re='([[:digit:]]+) scenarios[?]'
wip_scenarios_line=$(grep -E '^[[:digit:]]+ scenarios[?]' <report.log)
[[ $wip_scenarios_line =~ $wip_scenarios_re ]] && {
wip_scenarios=${BASH_REMATCH[1]}
}
我有一个在 Ubuntu (Linux) 上使用的脚本,我想将其转换为在 Ubuntu (Linux) 上使用和 MacOS X。Linux 上的 grep
不同于 FreeBSD(即 MacOS X)上的 grep
; grep
在 MacOS X 上不支持 -P
选项。不幸的是,在两个平台上使用 -E
选项不会给出相同的结果。考虑以下适用于 Linux 的代码:
wip_scenarios=$(grep -oP "^\d+ scenarios?" log/report.log | grep -oP "\d+")
echo "\n"
echo $wip_scenarios
这个 returns 一个 0
在 Linux 上。将所有 -P
替换为 -E
可以在 MacOS X 上运行,但在 Linux 上,这只是 returns 一个 null
,对其余部分没有帮助当我使用这样的条件时我的脚本:
if [ $wip_scenarios != 0 ];then
一个解决方案是在前面放一个标志并根据平台使用适当的选项集,但我希望有一个跨平台的解决方案。有办法吗?
对于您在此处提供的正则表达式,这很简单:将 \d
更改为 [[:digit:]]
。
因此:
wip_scenarios=$(grep -Eo '^[[:digit:]]+ scenarios[?]' <report.log | grep -Eo '[[:digit:]]+')
如果您的脚本以 #!/bin/bash
开头(因此只会是 运行 和 bash
),我还会考虑跳过对非标准扩展的依赖 grep -o
,而是根据 bash 本身来分离出您关心的数字:
# This works with any POSIX-compliant grep, but requires that the shell be bash
wip_scenarios_re='([[:digit:]]+) scenarios[?]'
wip_scenarios_line=$(grep -E '^[[:digit:]]+ scenarios[?]' <report.log)
[[ $wip_scenarios_line =~ $wip_scenarios_re ]] && {
wip_scenarios=${BASH_REMATCH[1]}
}