Bash在变量中的第5至第6下划线之间获取文本

时间:2019-11-05 13:22:49

标签: bash sed

我有一个名为$folder_name的变量,其中包含字符串

Release_2019_Config_V6_Standalone_PJ6678_Test

这是文件夹的名称。 我正在尝试从文件夹名称中提取PJ6678。 我知道文件夹名称会将用户ID(我需要的文本)放在第5个和第6个下划线之间,我不知道第6个下划线后会出现什么文本/符号。

我正在使用Bash脚本,如果有人可以使用此功能,我将非常感谢您的帮助,因为我在尝试使用sed时完全迷路了(阅读数小时后,我认为这是适用于该功能的正确工具工作?

4 个答案:

答案 0 :(得分:3)

这是仅限Bash的解决方案:

#!/bin/bash
INPUT="Release_2019_Config_V6_Standalone_PJ6678_Test"
IFS='_' read -ra IN <<< "$INPUT"
echo ${IN[5]}

或使用剪切:

cut -d '_' -f 6 <<< "Release_2019_Config_V6_Standalone_PJ6678_Test"

或使用awk:

awk -F "_" '{ print $6 }' <<< "Release_2019_Config_V6_Standalone_PJ6678_Test"

答案 1 :(得分:2)

如果您想要纯现金解决方案,则可以使用标记化文件名,并选择第5个元素

IFS=_ read -a token <<< "$folder_name"
id=${token[5]}

消除因每个文件夹名称启动其他程序而导致的依赖性和性能下降。

答案 2 :(得分:1)

尝试以下命令:

echo $a | awk -F'_'  '{print $6}'

在这里,_是定界符,$a是保存该值的变量。

答案 3 :(得分:1)

为完整起见,这是一个不依赖数组的bash扩展的纯壳解决方案。

$ folder_name=Release_2019_Config_V6_Standalone_PJ6678_Test
$ tmp=${folder_name#*_*_*_*_*_}  # Because we know how many _ to strip
$ echo ${tmp%_*}
PJ6678

由于#运算符去除了最短前缀,因此不允许*匹配任何_本身;如果确实如此,我们可以通过使下划线匹配模式中文字_之一来缩短前缀。