这是zmv公司命令以非递归方式用单个下划线替换任意数量的空格(感谢Stéphane Chazelas,他帮了我):

zmv--“**”“${f//#/_}”

这里有一个来自互联网的命令,它似乎也在做同样的事情,但递归地:

zmv--“(**/)(**)”“$1${2//(#-###|##)/_}”

有人能解释一下它是怎么工作的吗?具体来说( #-## #| ##)部分工程?

  • 1
    ##(与(#c1,))相当于扩展的regexp+(与{1,})正如你提到的第一个问答中提到的那样#(与(#c,)(#c0,))等于*(与{0,}). 请参阅关于glob运算符的文档(链接已经在你提到的第一个问答中给出)。 5月18日9:14
  • @斯特芬哈泽拉斯非常感谢,斯特芬。所以,##是用于+(一个或多个),#是用于*(零或更多),但什么是(一个或没有),有替代品吗?我读过文档,但没有找到容易理解的答案。
    – jsx97型
    5月19日7:43
  • 1
    ERE公司(图案)?将是(图案|)(图案或无)或(图案)(#c0,1)(a)c(c)计数为0到1图案s) 带有加长型吊球(如ERE(图案){0,1})单位为兹什。 5月19日8:20

1答案1

重置为默认值
5

有两个区别:

  • 第一个命令替换整个路径中的空格,但只考虑当前目录中的文件,因为该模式不使用递归globbing。第二个命令递归地查找子目录中的文档,并且只替换基本名称中的空格(some目录/some文件some目录/some_file).
  • 第一个命令仅替换空格序列。第二个命令还将短划线序列替换为可选的环绕空格。例如,foo酒吧,foo-条,foo---巴所有映射到foo_bar(_B).foo-bar夸克映射到foo_bar_qux.foo-bar公司也会映射到foo_bar(_B),但它与模式不匹配。

在第二个命令中,(**/)(* *)匹配当前目录下的所有路径,其中文件的基名称至少包含一个空格。括号创建命名组zmv公司放置在位置参数中,因此目录部分(相当于$f:h美元/)可用作$1在替换文本和基本名称中(相当于$f:t美元)可用作$2。请注意(**/)group是一个例外:通常括号关闭**,但是zmv公司对待(**/)特别是。

在更换过程中,$1$2将是原始名称(尾部/是的一部分$1).${2//…/_}用下划线替换出现的每一个模式。模式(#-###|##)使用“or”运算符:match是#-## #(零或多个空格、一个或多个破折号、零或更多空格)或##(一个或多个空格)。

4
  • 非常感谢。那就是,#表示前一个字符的零次或多次出现(如在与PERL兼容的正则表达式中)和##表示前一个字符出现一次或多次(如+在与PERL兼容的正则表达式中),对吗?
    – jsx97型
    5月18日4:54
  • @jsx97:在PCRE中表示0或1(我相信所有其他正则表达式引擎)。*表示0、1或更多。 5月18日6:19
  • @Olivier Dulac啊,是的,对不起。以防万一,我真的很喜欢regexr.com备忘单。
    – jsx97型
    5月18日7:15
  • 1

你必须登录来回答这个问题。

不是你想要的答案吗?浏览已标记的其他问题.