当我在我的bash终端上运行这个时:
grep -ob "amilase" <<< "α-amilase"我明白了:
3:amilase让我们将字节偏移量定义为匹配字之前的字节数,将字符偏移量定义为匹配字之前的用户可见字符数。
上面的3对应于匹配字的字节偏移量。α是一个占2字节的unicode字符,这就是我们得到3的原因。
但是如何获得字符偏移量,在本例中是2?为什么是2?如果您查看屏幕并计算匹配单词之前存在多少可见符号,您将数到2。
我正在寻找一个类似grep -o的解决方案,也就是说,如果每行有多个匹配,它们都会被报告。
发布于 2017-01-18 11:48:39
你可以把你自己的可怜人的grep弄出来!
将其放入一个名为“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开始)括号内的子表达式。
发布于 2017-01-18 11:49:29
如果您想要一个基于0的匹配索引,可以使用awk尝试:
awk '{print index($0,"amil")-1}'<<< "α-amilase"
2
awk '{print index($0,"amil")-1}'<<< "fooamilα-whatever"
3如果没有找到匹配项,则打印-1。
https://stackoverflow.com/questions/41718261
复制相似问题