gpt4 book ai didi

regex - 用awk模拟 "grep -oE"的停止条件

转载 作者:行者123 更新时间:2023-12-05 08:24:45 27 4
gpt4 key购买 nike

我正在尝试使用标准的 awk 调用来模拟 GNU grep -Eo

关于 -o 选项,这个人说的是:

-o --only-matching
     Print only the matched (non-empty) parts of matching lines, with each such part on a separate output line.

现在我有这段代码:

#!/bin/sh

regextract() {
[ "$#" -ge 2 ] || return 1
__regextract_ere=$1
shift
awk -v FS='^$' -v ERE="$__regextract_ere" '
{
while ( match($0,ERE) && RLENGTH > 0 ) {
print substr($0,RSTART,RLENGTH)
$0 = substr($0,RSTART+1)
}
}
' "$@"
}

我的问题是:如果匹配部分是 0-length,我是否需要继续尝试匹配该行的其余部分,还是应该移动到下一行(就像我已经做了)?我找不到需要前者的输入+正则表达式样本,但我觉得它可能存在。有什么想法吗?

最佳答案

这是一个 POSIX awk 版本,它与 a*(或任何 POSIX awk 正则表达式)一起工作:

echo abcaaaca |
awk -v regex='a*' '
{
while (match($0, regex)) {
if (RLENGTH) print substr($0, RSTART, RLENGTH)
$0 = substr($0, RSTART + (RLENGTH > 0 ? RLENGTH : 1))
if ($0 == "") break
}
}'

打印:

a
aaa
a

POSIX awk 和 grep -E 使用 POSIX 扩展正则表达式,除了 awk 允许 C 转义(如 \t)但 grep -E 没有。如果你想要严格的兼容性,你必须处理它。

关于regex - 用awk模拟 "grep -oE"的停止条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73120366/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com