<p>如果您想在纯bash中完成它,它可能会变得很棘手。我们的想法是利用支架扩展,这将照顾到所有的可能性。你知道吗</p>
<pre><code>$ a='.. '
$ [[ $a =~ ${a//?/(.)} ]] && b=${BASH_REMATCH[*]:1} && eval printf "%s\\\n" ${b// /\{,\" \"\}})
</code></pre>
<p><strong>它是如何工作的?</strong></p>
<p>这个想法本质上是转变</p>
<pre><code>'.. '
</code></pre>
<p>进入</p>
<pre><code>.{," "}.{," "}-{," "}-
</code></pre>
<p>让bash使用brace扩展来生成所有的组合。你知道吗</p>
<ol>
<li><p>bash测试将尝试匹配类似于<code>(.)(.)(.)(.)</code>的正则表达式<code>${a//?/(.)}</code>。它将所有匹配项存储在变量<code>BASH_REMATCH</code></p></li>
<li><p><strong><code>b=${BASH_REMATCH[*]:1}</code></strong>索引为0的<code>BASH_REMATCH</code>元素是字符串中与整个正则表达式匹配的部分。索引为<code>BASH_REMATCH</code>的<code>n</code>元素是字符串中与第n个带圆括号的子表达式匹配的部分。因此,除第一部分外,我们只对所有部分感兴趣:</p>
<pre><code>$ [[ $a =~ ${a//?/(.)} ]] && echo ${BASH_REMATCH[*]}
.. . . - -
$ [[ $a =~ ${a//?/(.)} ]] && echo ${BASH_REMATCH[*]:1}
. . - -
</code></pre></li>
<li><p><strong><code>${b// /\{,\" \"\}}</code></strong>用<code>{," "}</code>替换所有空格。这将允许我们使用大括号展开,我们需要用<code>eval</code>进行计算</p>
<pre><code>$ a='.. '
$ [[ $a =~ ${a//?/(.)} ]]
$ b=${BASH_REMATCH[*]:1}
$ echo "${b// /\{,\" \"\}}"
.\{," "\}.\{," "\}-\{," "\}-
</code></pre></li>
</ol>