在 zsh 中,如何使用行的源(stdout 或 stderr)注释已将 stdout 和 stderr 重定向到的文件中的每一行?
我想要将源名称添加到行首的输出,例如:
stdout: <a line written to stdout>
stderr: <a line written to stderr>
在 zsh 中,如何使用行的源(stdout 或 stderr)注释已将 stdout 和 stderr 重定向到的文件中的每一行?
我想要将源名称添加到行首的输出,例如:
stdout: <a line written to stdout>
stderr: <a line written to stderr>
是否有简洁的 zsh 正则表达式参数扩展来替换模式的最后一个匹配?
我知道这样做很丑陋,但我更喜欢更干净、更简洁的语法:
# param, pattern & replacement are placeholders below for real values
${(*S)param/%pattern(#b)(*)/replacement${match[1]}}
它启用了extended_glob,选择最短匹配,将模式与值的末尾进行匹配$param
,指定模式,启用反向引用,将模式最后一次匹配之后的文本保存在反向引用中,然后用我的替换替换匹配,使用反向引用恢复匹配后的文本。
在 zsh 中,如何在文件名生成 glob 中启用 extended_glob inline?
假设我想ls
在所有未命名的路径上运行a
,可以通过以下方式完成:
setopt -o extendedglob
ls ^a
但是,有没有办法可以在不使用的情况下为上述文件名生成 glob 启用 extended_glob setopt -o extendedglob
?
我知道我可以使用(*)
参数扩展标志来启用extended_glob inline(不使用setopt -o extendedglob
)以进行正则表达式参数扩展,例如:
printf $'%s\n' "${(*)x#^a}"
如果输入是变量而不是内联,则 zsh 参数扩展替换模式会以不同方式解析字符串。
我认为它与字符转义有关,但我不确定如何解决它。
在下面的代码中,>
应该从 printf 输出中过滤掉, *
& ,这发生在使用变量 的第一个参数扩展中。2.5.8
versions
但是当curl
调用被内联时,上面的 3 个值并没有被过滤掉。
如何内联curl
调用但仍过滤掉 3 个值?
#!/usr/bin/env zsh
setopt EXTENDED_GLOB
# variable: 3 values are correctly filtered out
versions=$(curl '--silent' '--location' 'https://api.sdkman.io/2/candidates/groovy/darwin/versions/list?current=2.5.8&installed=2.5.8')
printf -- '%s\n' ${${(Z+n+)versions//[*+>][ *+>]# [[:graph:]]##}}
# inlined: 3 values are not filtered out
printf -- '%s\n' ${${(Z+n+)$(curl '--silent' '--location' 'https://api.sdkman.io/2/candidates/groovy/darwin/versions/list?current=2.5.8&installed=2.5.8')//[*+>][ *+>]# [[:graph:]]##}}
有没有更有效的方法在 zsh 中执行以下操作?
我想可能有办法摆脱中间数组参数a
和/或b
.
该脚本从命令中获取一些输出。如果该输出不为空,它会跳过前两行,然后将剩余每一行第一个空格之前的文本用作另一个命令的参数。
#!/usr/bin/env zsh
packages=$(pip3 list -o)
if [[ -n ${packages} ]]; then
print "${packages}"
a=("${(f)packages}")
b=("${a[@]:2}")
PYTHONWARNINGS=ignore:DEPRECATION pip3 install -U "${b[@]%% *}"
fi
如何在 zsh 中获取字符的 Unicode 代码点?
例如,如果我有:
s=abc
如何获得s[2]
(即"b"
=的代码点0x0062
)的代码点?
(${(@s.\n.)s})
在 zsh 中, (点)和(斜线)之间有什么区别(${(@s/\n/)s})
,例如:
s=a\\nb\\nc\\nd
a=(${(@s.\n.)s})
b=(${(@s/\n/)s})