Bash 参数替换(baparmsub?)不起作用

Bash 参数替换(baparmsub?)不起作用

[ 使用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:]])/_}

相关内容