反转 shell 式大括号扩展

Reversing shell-style brace expansion

Brace expansion 采用一种模式并将其扩展。例如:

sp{el,il,al}l

扩展为:

spell spill spall

是否有一种算法(可能具有 JavaScript 实现)以最小化构造的字符串的方式进行反向操作?

即,接受数组 [spell spill spall] 和 return 字符串 "sp{e,i,a}ll"

可以通过多种不同的方式最小化结果字符串,但既然你提到了 Bash,我将选择 Bash 方式,这不是最优化的方式。

是的,有一个Bash方法! Bash 创作者已将其作为 readline 命令包含在内 complete-into-braces。交互使用 Bash 时,如果您点击 Meta{(即 Alt{Esc-then-{ 在我的机器上),所有可能的完成都被分组到一个大括号中扩张.

$ echo /usr/
bin/     games/   include/ lib/     local/   sbin/    share/   src/  

$ echo /usr/{bin,games,include,l{ib,ocal},s{bin,hare,rc}}

上面,我第一次点击Tab显示所有可能的完成,第二次我点击Alt{.

回到你的问题:你正在寻找一种算法。显然你可能会在 Bash source code. The function you are looking for is really_munge_braces() in bracecomp.c

中找到一些东西

根据原始问题的要求,node-brace-compression 包含一个 JavaScript 实现。例如

var compress = require('brace-compression');
var data = [
  'foo-1',
  'foo-2',
  'foo-3'
];

console.log(compress(data));
// => "foo-{1..3}"