I have several files named with different lenght, but have a pattern i can find to used SED. I want to remove a determined set of characters in the middle of it so i can rename them, but i am failing miserably at some points... the example file is:
[Matheus]_203-34510033_20220217111125(237).wav
the name in the begging changes, as well as the value inside the parentheses, that is incremented on each file and soon will be bigger than 3 digits. I need to remove the 6 digits before the parenthesis, and my regex can find them correctly:
s/.*_203.*_202\d{5}\K. ?(?=\()//
I am using the following script so i can rename the file:
#!/bin/bash
for filename in *.wav; do
newFilename=$(sed -E 's/.*_203.*_202\d{5}\K. ?(?=\()//' <<< "$filename")
mv "$filename" "$newFilename"
done
when i run the script, i receive the output:
sed: -e expression #1, character 46: Invalid Preceding regular expression.
What is wrong with my sed?
CodePudding user response:
If you want to match the pattern between parenthesis, the (?=...) syntax is not supported. Your pattern will probably become
s/.*_203.*_202[0-9]{5}. ?\(([^\)] )\)/\1/
CodePudding user response:
If you use the Perl based rename
command:
$ rename -n 's/.*_203.*_202\d{5}\K. ?(?=\()//' *.wav
rename([Matheus]_203-34510033_20220217111125(237).wav, [Matheus]_203-34510033_20220217(237).wav)
-n
option is for dry run, remove it for actual renaming. Also, you don't need the .*
at the start of the regexp.
I need to remove the 6 digits before the parenthesis
rename -n 's/\d{6}(?=\()//' *.wav
If you don't have the command installed, check your distribution's repository or you can install it from metacpan: File::Rename.