Tuesday, October 4, 2022

[SOLVED] Bash script with regex and capturing group

Issue

I'm working on a bash script to rename automatically files on my Synology NAS.

I have a loop for the statement of the files and everything is ok until I want to make my script more efficient with regex.

I have several bits of code which are working like as expected:

filename="${filename//[-_.,\']/ }"
filename="${filename//[éèēěëê]/e}"

But I have this:

filename="${filename//t0/0}"
filename="${filename//t1/1}"
filename="${filename//t2/2}"
filename="${filename//t3/3}"
filename="${filename//t4/4}"
filename="${filename//t5/5}"
filename="${filename//t6/6}"
filename="${filename//t7/7}"
filename="${filename//t8/8}"
filename="${filename//t9/9}"

And, I would like to use captured group to have something like this:

filename="${filename//t([0-9]{1,2})/\1}"
filename="${filename//t([0-9]{1,2})/${BASH_REMATCH[1]}}"

I've been looking for a working syntax without success...


Solution

The shell's parameter expansion facility does not support regular expressions. But you can approximate it with something like

filename=$(sed 's/t\([0-9]\)/\1/g' <<<"$filename")

This will work regardless of whether the first digit is followed by additional digits or not, so dropping that requirement simplifies the code.



Answered By - tripleee
Answer Checked By - Willingham (WPSolving Volunteer)