Grep 在段落中省略多次出现某个模式的匹配项

Grep 在段落中省略多次出现某个模式的匹配项

我尝试在一个段落中找到“单词单词单词单词单词单词单词”形式的所有表达。

为此,我使用表达式grep -E -o '([^ ]+ ){4}the( [^ ]+){5}'

但在这个例子中echo "word1 word2 word3 word4 the word5 word6 word7 word8 word9 the quoi écrire hihi haha the a b c d e" | grep -E -o '([^ ]+ ){4}the( [^ ]+){5}'

我只得到结果

word1 word2 word3 word4 the word5 word6 word7 word8 word9
quoi écrire hihi haha the a b c d e

但我也想要

word6 word7 word8 word9 the quoi écrire hihi haha the

我的代码问题出在哪里?

答案1

问题是您需要迭代执行 grep,每次删除第一个匹配的部分:

string="word1 word2 word3 word4 the word5 word6 word7 word8 word9 the quoi écrire hihi haha the a b c d e"

copy=$string
while m=$(grep -Eo '([^ ]+ ){4}the( [^ ]+){5}' <<<"$copy"); do
    echo "$m" | head -1    # print just the first one
    copy=${copy#* the }    # remove up to and including the _first_ " the "
done
word1 word2 word3 word4 the word5 word6 word7 word8 word9
word6 word7 word8 word9 the quoi écrire hihi haha the
quoi écrire hihi haha the a b c d e

或者,使用 bash 的内置正则表达式支持,这意味着您不需要解析任何grep输出来打印第一个匹配项:

copy=$string
# the pattern is *unquoted*
while [[ $copy =~ ([^ ]+ ){4}the( [^ ]+){5} ]]; do
    echo "${BASH_REMATCH[0]}"
    copy=${copy#* the }
done

相关内容