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

我正在尝试使用标准的 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 没有。如果你想要严格的兼容性,你必须处理它。

https://stackoverflow.com/questions/73120366/

相关文章:

php - 如何确定数据是在 PHP 中增加还是减少

node.js - 类型不可分配给 express-jwt 中的类型 'GetVerificatio

c - C语言中如何减少或替换else if语句?

python - 如何获取 Pandas 表中所有命名类别的最大值

laravel - "npm run watch"不工作并返回错误 's saying ' 缺少 "

r - 如何在 R 中将向量分解为连续的组

c - 打包的相同结构是否保证具有相同的内存布局?

python-3.x - 在python中将字符串写入文本文件

python - 如何从不同文件导入和调用 'main'函数

java - HashMap.clear() 减少内存?