如何将正则表达式的匹配分配给变量?

sam*_*moz 15 regex bash shell

我有一个包含各种条目的文本文件.每个条目都以包含所有星号的行结束.

我想使用shell命令来解析此文件并将每个条目分配给变量.我怎样才能做到这一点?

这是一个示例输入文件:

***********
Field1
***********
Lorem ipsum
Data to match
***********
More data
Still more data
***********

这是我的解决方案到目前为止的样子:

#!/bin/bash
for error in `python example.py | sed -n '/.*/,/^\**$/p'`
do
    echo -e $error
    echo -e "\n"
done
Run Code Online (Sandbox Code Playgroud)

但是,这只是将匹配文本中的每个单词分配给$ error,而不是整个块.

Cas*_*bel 27

我很惊讶在这里看不到本地bash解决方案.是的,bash有正则表达式.您可以在线找到大量随机文档,特别是如果在查询中包含"bash_rematch",或者只是查看手册页.这是一个愚蠢的例子,取自这里并略微修改,打印整个匹配,以及每个捕获的匹配,用于正则表达式.

if [[ $str =~ $regex ]]; then
    echo "$str matches"
    echo "matching substring: ${BASH_REMATCH[0]}"
    i=1
    n=${#BASH_REMATCH[*]}
    while [[ $i -lt $n ]]
    do
        echo "  capture[$i]: ${BASH_REMATCH[$i]}"
        let i++
    done
else
    echo "$str does not match"
fi
Run Code Online (Sandbox Code Playgroud)

重要的是,[[ ... ]]使用其正则表达式比较的扩展测试=~存储整个匹配${BASH_REMATCH[0]}和捕获的匹配${BASH_REMATCH[i]}.