当我在我的bash终端上运行时:
grep -ob "amilase" <<< "α-amilase"
我明白了:
3:amilase
让我们将字节偏移量定义为匹配字之前的字节数,将字符偏移量定义为匹配字之前的用户可见字符数。
在上面,3对应于匹配字的字节偏移。 α是一个占用2个字节的unicode字符,这就是我们得到3的原因。
但是如何获得字符偏移量,在这种情况下是2?为什么2?如果您查看屏幕并计算匹配单词之前存在多少个可见符号,则计数为2。
我正在寻找一种行为类似grep -o的解决方案,也就是说,如果每行有多个匹配项,则会报告它们。
答案 0 :(得分:3)
你可以鞭打自己的穷人的傻瓜!
将它放在一个名为mygrep
:
#!/bin/bash
# Takes extended regex as first argument
# Text to match received on standard in
if
[[ $# != 1 ]]
then
echo "This script takes one argument as input"
exit 1
fi
while IFS= read -r LINE
do
while true
do
[[ "$LINE" =~ ^(.*)($1)(.*)$ ]] || break
echo "${#BASH_REMATCH[1]}:$1"
LINE="${BASH_REMATCH[1]}"
done | tac
done
然后只需在命令中替换grep
:
mygrep "amilase" <<< "α-amilase"
脚本遍历所有输入行,将每一行与作为参数接收的正则表达式匹配(它可以是一个简单的字符串,但如果需要,您可以使用正则表达式的全部功能)。我更新了我的答案,允许在一行上进行多项匹配。 | tac
用于反转行的顺序,因为贪婪匹配首先匹配每行的最后一次出现:如果你不介意反向出现匹配,只需删除| tac
。
我不确定输出是否符合您的要求,您可以轻松自定义。
请注意=~
运算符执行模式匹配(egrep语法),BASH_REMATCH是用于访问(从索引1开始)括号内的子表达式的数组。
答案 1 :(得分:1)
如果你想要一个基于0的匹配索引,你可以尝试使用awk:
awk '{print index($0,"amil")-1}'<<< "α-amilase"
2
awk '{print index($0,"amil")-1}'<<< "fooamilα-whatever"
3
如果未找到匹配项,则会打印-1