bash 字符串提取

bash 字符串提取

我想从以下字符串的最后部分中提取第二个字段:

foo_1.103.debug_xx.ver21-inc-1          --> string extracted "debug_xx"
foo_1.103.1.0.release_32_xx.ver21-inc-1 --> string extracted "release_32_xx"
foo_1.103.1.0.release_xx.ver21-inc-1    --> string extracted "release_xx"

任何帮助将不胜感激。

答案1

与纯bash

IFS='.' read -a p <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'
echo "${p[${#p[@]}-2]}"

您可以使用以下方法更轻松地做到这一点awk

awk -F. '{print$(NF-1)}' <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'

如果要解析的字符串是文件名,您仍然可以使用awk

awk -F. 'BEGIN{for(i=1;i<ARGC;i++){$0=ARGV[i];print$(NF-1)}}' foo*

答案2

sed执行此操作的命令:

sed 's/foo_[0-9.]*\([^.]*\).*/\1/' inputfile

当然,假设其中inputfile包含您的字符串,每个字符串都在自己的行上(如您的示例所示)。如果说您正在使用文件名,那么将结果通过管道传输ls到 中sed也将起作用。

答案3

用于${VAR%PATTERN}删除与最后一个字段对应的后缀,然后${NEWVAR##PATTERN}删除与除最后一个剩余字段之外的所有字段对应的前缀。

all_but_last_field=${mystring%.*}
second_to_last_field=${all_but_last_field##*.}

您需要将字符串存储在变量中,并将中间结果存储在变量中,不能直接链接扩展(可以在 zsh 中,但不能在 bash 中)。

答案4

假设这些是文件:

ls foo*|awk -F。 '{打印$3}'

相关内容