2

我正在尝试通过正则表达式匹配特定字符的所有位置。我可以用expr 索引来做到这一点,但这只匹配字符串中的第一个字符。

echo $(expr index "$z" '[\x1F\x7F-\x9F]') 

注意:$z 是包含字符串的 var

这(正确)返回:

6

我知道在这个字符串中,我在位置 6 和 12 有两个匹配的字符,我想返回匹配字符的所有位置,而不仅仅是第一个。

你能帮助我吗?谢谢!

4

2 回答 2

2

这是一个使用 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);
           }
       }
}'
于 2013-04-24T13:37:39.387 回答
0

您可能喜欢使用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

进程替换来自

于 2021-06-06T09:24:44.847 回答