bash - 最后一次出现下划线后从字符串中提取子字符串

标签 bash parameter-expansion

我在Linux Shell中有一个字符串。该字符串中包含下划线。

我想从字符串中提取一个子字符串。

我想在下划线的第三次出现之后提取子字符串,从字符串的末尾开始计数。

file_name='email_Tracking_export_history_2018_08_15'
string_name="${file_name#*_*_*_}"
file_name2='email_Tracking_export_2018_08_15'
string_name2="${file_name2#*_*_*_}"

echo "$string_name"
echo "$string_name2"


结果

history_2018_08_15
2018_08_15


如您所见,string_name="${file_name#*_*_*_}"无法正常工作。

所需结果:

2018_08_15
2018_08_15


我怎样才能达到理想的效果?

最佳答案

您可以一步完成,但是有点麻烦。设置文件名后



file_name='email_Tracking_export_history_2018_08_15'


我们得到的子字符串包含了除了我们最终想要的东西之外的所有东西:

$ echo "${file_name%_*_*_*}"
email_Tracking_export_history


这几乎是我们想要的,只是缺少下划线,因此我们添加以下内容:

$ echo "${file_name%_*_*_*}_"
email_Tracking_export_history_


现在我们知道我们必须从字符串开头删除什么,并将其插入到${word#pattern}扩展中:

$ echo "${file_name#"${file_name%_*_*_*}_"}"
2018_08_15


或者我们将其分配给变量以供进一步使用:

string_name=${file_name#"${file_name%_*_*_*}_"}
              └───┬───┘ │  └───┬───┘ └─┬──┘  │
             outer word │  inner word  └────────inner pattern
                        └───outer pattern────┘


和第二个字符串类似。

关于bash - 最后一次出现下划线后从字符串中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52250649/

相关文章:

linux - 在 Bash 中处理 float

linux - 如何仅在出现错误时中止函数,而不中止脚本?

arrays - bash 中的数组运算符

bash - shell中 "${0##*[\\/]}"是什么意思?

bash - 如何记住哪个扩展 ${var%} ${var#} 从哪一端开始工作?

bash - 将 Ubuntu 版本从 lsb-releases 剪切为 bash 中的变量

linux - 从 ssh 启动 zookeeper

Bash 参数扩展 - 获取文件的直接父目录

Bash 4.4 提示转义当前正在运行的作业数量

bash - 为什么 ${1[@]} 无效,尽管 ${stringVar[@]} 可以正常工作?