模式匹配 shell 脚本中的后缀和前缀

模式匹配 shell 脚本中的后缀和前缀

我有这个变量,我想删除前缀和后缀:

var="abcde"
echo "${${var#a}%e}" 

我在 zsh 中尝试了这个片段,它工作正常 - returns bcd。它使用模式匹配(前缀和后缀)。虽然,当我在 posix 兼容的 shell 脚本中运行它时(我使用模式匹配而不是 bash 字符串操作的原因),我得到了输出bad substitution

什么事?我必须创建另一个变量来存储"${var#a}"还是可以在一行中完成?我想要 posix 兼容的脚本。

答案1

不,您不需要另一个变量,是的,您可以在一行中完成。

这可能是最便携的解决方案,但它会覆盖变量值(仍然使用问题中提到的单个变量)。它仅使用 shell 语言的参数扩展:

var="abcde"
var="${var#a}" # remove prefix
echo "${var%e}" # remove suffix

单行代码的创建可能始终如下所示:

var="abcde"; var="${var#a}"; echo "${var%e}"

如果您不想覆盖变量,函数参数是完美的临时变量。尽管您的示例很简单,但您可以为其创建一个函数,该函数隐藏使用的额外变量。这种方法特别有用,因为 POSIX shell 中没有局部变量:

# this function runs in a subshell, so all new variables are lost on the return
remove_pre_post() (
    local_var="${1#a}" # uses the first argument
    echo "${local_var%e}"
)

var="abcde"
remove_pre_post "$var" # call function

另一个符合 POSIX 标准的解决方案可能涉及sed

var="abcde"
echo "$var" | sed 's/^a//; s/e$//'

您仅提供了示例,没有任何模式匹配。请记住,一旦模式匹配成为一件事,您可能会看到一种解决方案比另一种更好,具体取决于模式的复杂性。

相关内容