我正在尝试通过正则表达式匹配特定字符的所有位置。我可以用expr 索引来做到这一点,但这只匹配字符串中的第一个字符。
echo $(expr index "$z" '[\x1F\x7F-\x9F]')
注意:$z 是包含字符串的 var
这(正确)返回:
6
我知道在这个字符串中,我在位置 6 和 12 有两个匹配的字符,我想返回匹配字符的所有位置,而不仅仅是第一个。
你能帮助我吗?谢谢!
这是一个使用 awk 的命令。它打印与正则表达式匹配的所有位置/0-9/
echo $z | awk '{s=$0; i=1; idx=0;
while(i>0){
i=match(s, /[0-9]/);
if(i>0) {
idx += i;
print idx;
s=substr(s, i+1);
}
}
}'
您可能喜欢使用grep
.
#!/bin/bash
matches=();
# Used a "Process Substitution" because of the loop's subshell
while read match
do
matches+=( "$match" );
done \
< <(
printf '%s\n%s' \
'somedata{a917am}some{8ka81a}data' \
'awd123{ad123d}adad' \
| grep -Eobn '\{[0-9a-z]{6}\}' # The magic is here
);
for (( i = 0; i < ${#matches[@]}; i++ ));
do
matchRaw="${matches[$i]}";
match="${matchRaw#*\:}";
match="${match#*\:}";
matchLine="${matchRaw%%\:*}";
matchChar="${matchRaw#*\:}";
matchChar="${matchChar%%\:*}";
matchLength="${#match}";
printf 'Match #%s, line %2s, char %2s, length %2s: "%s"\n' \
"$((i + 1))" \
"$matchLine" \
"$matchChar" \
"$matchLength" \
"$match";
done
输出:
Match #1, line 1, char 8, length 8: "{a917am}"
Match #2, line 1, char 20, length 8: "{8ka81a}"
Match #3, line 2, char 39, length 8: "{ad123d}"
适用于grep (GNU grep) 2.25
.
有关的:
grep --help
# -E, --extended-regexp PATTERN is an extended regular expression (ERE)
# -o, --only-matching show only the part of a line matching PATTERN
# -b, --byte-offset print the byte offset with output lines
# -n, --line-number print line number with output lines