我在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/