Home > Software design >  correct return of sed and renaming
correct return of sed and renaming

Time:02-22

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. ?(?=\()//

regex exemple

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.

  • Related