【问题标题】:Trimming whitespace from the ends of a string in Zsh从 Zsh 中的字符串末尾修剪空格
【发布时间】:2021-09-16 10:40:32
【问题描述】:

如何在 Zsh 中删除字符串末尾的所有空格而不产生另一个进程?

查看the documentation for expansion in Zsh(即14.3 Parameter Expansion 和14.8.1 Glob Operators 部分)——也可以通过$ man zshexpn 查看——我编写了以下代码:

${${var##[:space:]##}%%[:space:]##}

但 Zsh 似乎无法识别 [:space:] glob 运算符。根据我对文档中以下语句的理解,它应该:

在下面讨论的需要模式的扩展中,模式的形式与用于文件名生成的形式相同;请参阅文件名生成。请注意,这些模式以及任何替换的替换文本本身都会受到参数扩展、命令替换和算术扩展的影响。

这是 Zsh 中的错误还是我忽略了什么?

目前,我只使用${${var## ##}%% ##},它至少替换了末尾的所有空格字符。

我使用的是 Zsh 5.8。

【问题讨论】:

    标签: string zsh whitespace glob parameter-expansion


    【解决方案1】:

    你真的很亲密。

    1. 您需要稍微修改一下POSIX Basic Regular Expression 字符类语法
    2. 您可以使用(MS)(匹配子字符串)parameter expansion flags来简化表达式。
    ${(MS)var##[[:graph:]]*[[:graph:]]}
    

    解决方案

    在下面的示例中,我们将删除前导/尾随空格的参数具有标识符var。根据需要在您自己的代码中替换它。

    typeset var=$'\n\t   abc   def   \n\t'
    

    打印去掉任何前导/尾随空格的参数:

    print -n -- ${(MS)var##[[:graph:]]*[[:graph:]]}
    

    输出:abc def

    【讨论】:

      【解决方案2】:

      引用zsh Glob Operator 文档:

      请注意,方括号是包围整个字符集的附加方括号,因此要测试单个字母数字字符,您需要‘[[:alnum:]]’。

      所以只使用[:space:] 而不是[[:space:]] 是你的问题。


      旁白:

      在zsh glob 模式中有几种方法可以表示“匹配前一个事物的多个副本”。您使用的一种需要打开EXTENDED_GLOB 选项,即使用x##,它匹配一个或多个出现的模式x(还有x#,它匹配零次或多次出现的模式 x)。另一个需要KSH_GLOB 选项才能工作的是+(x),它也匹配x 的一个或多个出现(并且*(x) 匹配0 个或多个。)这种样式具有使用ksh 的优势和bash(后者需要启用extglob 选项),因此来自另一个shell 的人可能更熟悉。

      所以:

      $ foo=$(printf " \t bar baz \t ") # Spaces and tabs before and after
      $ printf ">%s<\n" "$foo"                               
      >    bar baz     <
      $ printf ">%s<\n" "${${foo##[[:space:]]##}%%[[:space:]]##}"
      >bar baz<
      $ setopt KSH_GLOB                                            
      $ printf ">%s<\n" "${${foo##+([[:space:]])}%%+([[:space:]])}"
      >bar baz<
      

      根据需要删除所有前导和尾随空白字符。

      另请注意,这种扩展嵌套是zsh 特定的。它不适用于其他 shell,其中两个删除需要多个步骤。

      【讨论】:

        猜你喜欢
        • 2013-09-11
        • 2017-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多