Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extract substring from string after third last occurrence of underscore

I have a string in Linux shell. This string contains underscores in it.

I want to extract a substring from the string.

I want to extract the substring after the third occurrence of an underscore, counted from the end of the string.

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"

The result

history_2018_08_15
2018_08_15

As you see, string_name="${file_name#*_*_*_}" is not working properly.

Desired result:

2018_08_15
2018_08_15

How can I achieve my desired result?

like image 866
nmr Avatar asked Apr 26 '26 13:04

nmr


1 Answers

You can do it in a single step, but it's a bit convoluted. After setting the filename

file_name='email_Tracking_export_history_2018_08_15'

we get the substring that contains everything except what we want to have in the end:

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

This is almost what we want, just an underscore missing, so we add that:

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

Now we know what we have to remove from the beginning of the string and insert that into the ${word#pattern} expansion:

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

or we assign it to a variable for further use:

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

And analogous for the second string.

like image 93
Benjamin W. Avatar answered May 05 '26 09:05

Benjamin W.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!