我想从以下字符串的最后部分中提取第二个字段:
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}'