bash:如何一步使用多个字符串操作(参数扩展)?

com*_*ium 9 bash

我的string=substr1-substr2-substr3.substr4子字符串长度可变。substr3我想从中提取string并正在考虑使用${string##pattern}${string%pattern}字符串操作扩展来完成它。使用这种方法,很明显我需要在生成的扩展上运行${string##*-}并运行${string%.*},反之亦然。我的问题是:

  1. 这是最好的选择吗?
  2. 如果是,我如何一步运行两者?当我尝试做类似${string##*-${string%.*}}or 的事情时${string%.*${string##*-}},我只是取回完整的字符串。我意识到我总是可以通过将中间变量分配给第一步的结果来分两步进行提取,然后对其进行操作;但我想一步到位。我该怎么办?

蒂亚!

ilk*_*chu 6

给定

string=substr1-substr2-substr3.substr4
Run Code Online (Sandbox Code Playgroud)

${string%.*}

substr1-substr2-substr3
Run Code Online (Sandbox Code Playgroud)

所以,${string##*-${string%.*}}

${string##*-substr1-substr2-substr3}
Run Code Online (Sandbox Code Playgroud)

这意味着从 开始删除string直到并包括 的所有内容-substr1-substr2-substr3。但是 中没有这样的子字符串string,因为 前面没有破折号substr1,所以你得到了原始字符串。

你可能想要的是

string=substr1-substr2-substr3.substr4
result="${string%.*}"
result="${result##*-}"
Run Code Online (Sandbox Code Playgroud)

这导致result包含substr3

在 Zsh 中,您可以一步完成:result=${${string%.*}##*-},但这在 Bash 中不起作用。

#在 Bash 中,您只能在or的右侧使用扩展%,这对您没有帮助,因为您需要从字符串的开头和结尾删除部分。


或者,如果$string不包含换行符,您可以使用

IFS=.- read -r a b c d <<< "$string"
Run Code Online (Sandbox Code Playgroud)

substr3从 中读出c

在这种情况下,根据 shell 和字符串的大小, 的内容$string将存储在临时文件中或通过管道提供,该管道read将从中读取第一行并根据 拆分它$IFS