I have a bunch of files which contain prefix codes in brackets. I'd like to turn these prefixes into suffixes, like so:
Finance-(4BF)-001.doc --> Finance-001-4BF.doc
Corporate-(K04)-001.doc --> Corporate-001-K04.doc
I previously wrote a very simple VBScript to do this on a Windows machine but now I need to do this on Linux. After some tedious searching I can't find a simple and elegant way to apply a regular expression to a filename and rename it using the regex matches.
So far I have this:
#!/bin/bash
for i in *.doc
do
x=${i//[\(\)]/}
echo "$i renames to: $x"
done
The output of this is:
Corporate-(K04)-001.doc renames to: Corporate-K04-001.doc
Finance-(4BF)-001.doc renames to: Finance-4BF-001.doc
I know the regular expression above is just stripping the brackets () out of the filename... but surely there must be a way to match their contents (e.g. \((\w)\)
) and then use that match in the rename command (e.g. $1
)?
Also being a Linux novice I don't understand what x=${...}
is doing, and since I don't know what it's called I can't Google it. I presume it's applying a regex to the string i
but in that case why can't I extract matches from it like $1
and $2
etc?
Thanks!
The construct ${...}
is called "parameter expansion" and can be found in the Bash manual.
The replacement feature is very elementary and does not support backreferences ($1
). You can use sed
instead:
x=$(sed -E 's/\(([[:alnum:]]+)\)-([[:alnum:]]+)/\2-\1/' <<< "$i")
Note that [[:alnum:]]
is the same as \w
in other languages, but POSIX regular expressions don't have the latter. See man re_format
for details.
The ${parameter/pattern/string}
syntax in Bash parameter expansion is not a regular expression; it is a glob (with #
and %
treated specially).
Bash has [[ =~ ]]
conditional expressions taking regular expressions, which puts captured groups into the ${BASH_REMATCH[@]}
array.
#!/bin/bash
for i in *.doc; do
if [[ $i =~ ^(.*)-\((.*)\)-([^.]*)(..*)?$ ]]; then
x="${BASH_REMATCH[1]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
echo "$i renames to: $x"
fi
done
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With