从倒数第三个下划线出现后的字符串中提取子字符串

nmr*_*nmr 3 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"
Run Code Online (Sandbox Code Playgroud)

结果

history_2018_08_15
2018_08_15
Run Code Online (Sandbox Code Playgroud)

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

期望的结果:

2018_08_15
2018_08_15
Run Code Online (Sandbox Code Playgroud)

我怎样才能达到我想要的结果?

Ben*_* W. 5

您可以一步完成,但有点复杂。设置文件名后

\n\n
file_name=\'email_Tracking_export_history_2018_08_15\'\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$ echo "${file_name%_*_*_*}"\nemail_Tracking_export_history\n
Run Code Online (Sandbox Code Playgroud)\n

这几乎就是我们想要的,只是缺少下划线,所以我们添加:

\n
$ echo "${file_name%_*_*_*}_"\nemail_Tracking_export_history_\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$ echo "${file_name#"${file_name%_*_*_*}_"}"\n2018_08_15\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
string_name=${file_name#"${file_name%_*_*_*}_"}\n              \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98 \xe2\x94\x82  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98 \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98  \xe2\x94\x82\n             outer word \xe2\x94\x82  inner word  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80inner pattern\n                        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80outer pattern\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

第二根弦也类似。

\n