[ 使用bash -cx 'a="_IN_workstation"; b=${a/[a-zA-Z]*[a-zA-Z]/_};echo x.$bx' 确实部分有效,但缺少括号会使匹配出现偏差。因此,这表明括号处理存在问题,但我见过GNU 自动配置这暗示了其他的事情。有人熟悉 bash 内部结构吗?]
我在输入 _PREROUTING _POSTROUTING 之类的值来去除字母字符时遇到了问题:
a=${step/\_+([a-zA-Z]/\_}
[ note: replacing underscore with \x5f does nothing for the script although using sed works via 's/_[a-zA-Z][a-zA-Z]*/_/gp' but that is NOT what i __wanted__]
(GNU)[https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html]似乎同意我的观点,但我的 bash(5.1)没有商店 +patsub_replacement适用于 5.2。
linux mint 版本和 bash 版本参见步变量和[原始脚本]
(Bash 的 cmdline nft cmd vs script 存在问题)
我尝试过,[:alpha:]
但是在脚本中却不起作用,在命令行中也很少起作用。
答案1
您必须使用shopt -s extglob
通常on
用于交互式 shell 的,但off
在脚本中。
#!/bin/bash
shopt -s extglob
step=_SOME_under_SCORES
a=${step//_+([a-zA-Z])/_}
echo "[$step]=>[$a]"
$ ./check.sh
[_SOME_under_SCORES]=>[___]
请参阅man bash
章节模式匹配:
如果外接球 使用内置命令 shopt 启用 shell 选项后,可以识别多个扩展模式匹配运算符 […]
答案2
显然,机械之神们已经嘲笑我很久了。我相信 Alexey Ten 确实为这个答案做出了很大贡献。
y= ${步骤//_[[:alpha:]]+([[:alpha:]])/_}