我尝试在一个段落中找到“单词单词单词单词单词单词单词”形式的所有表达。
为此,我使用表达式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