我正在尝试使用标准的 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/