使用长公共字符串进行 Bash 扩展

问题描述 投票:0回答:1

我想比较两个名称相似的文件,所以我想要一个扩展为

foo-averylongstring-bar baz-averylongstring-quux
的 Bash 表达式。

不幸的是,像

{foo,baz}-averylongstring-{bar,quux}

 这样的大括号表达式也会创建两个无效的组合,例如 
baz-averylongstring-bar
。 Bash 文档中有一些关于美元符号阻止扩展的内容,但据我了解,
${...}
是变量扩展而不是大括号扩展。

bash brace-expansion
1个回答
0
投票
你不能通过大括号扩展来做到这一点。每个支撑单元都是独立的,并与相邻材料结合生成组合。不存在两个独立的支撑扩展并行工作而不是作为叉积的情况。 shell 没有任何我们可以利用的并行循环。

我认为最简单的解决方案是将长的公共字符串放入短变量中:

x='averylong...string' diff foo-$x-baz bar-$x-quux
如果我们在一种语言中有某种并行迭代,我们可以做如下事情:

1> `diff @(mapcar (ret `@1-longstring-@2`) '#"foo baz" '#"bar quux")` "diff foo-longstring-bar baz-longstring-quux"
如果能在大括号扩展中内置一个简洁的符号,那就太好了。唯一的问题是,我们尝试的任何方式都会破坏向后兼容性。想象一下,方括号尚未用于字符类通配符。我们可以让方括号中的所有项目都属于并行扩展:

[foo,baz]-longstring-[bar,quux]
由于我们没有方括号,我们可以用大括号玩一些游戏,比如使用 

|

 来指示要并行的表达式:

{|foo,baz}-longstring-{|bar,quux}
我已经编写了大括号扩展的实现,因此对我来说,这是扩展它的一个有趣的可能性。因为它是一个库函数,所以我可以使用标志来启用或禁用 

|

 字符的识别。

Bash 也可以做同样的事情;有一些

shopt

 来实现这样的事情。

© www.soinside.com 2019 - 2024. All rights reserved.