【问题标题】:Trimming whitespace from the ends of a string in Zsh从 Zsh 中的字符串末尾修剪空格
【发布时间】:2021-09-16 10:40:32
【问题描述】:
【问题讨论】:
标签:
string
zsh
whitespace
glob
parameter-expansion
【解决方案1】:
你真的很亲密。
- 您需要稍微修改一下POSIX Basic Regular Expression 字符类语法
- 您可以使用
(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,其中两个删除需要多个步骤。