Hi, I posted here before for adding up of datafile name each time, here is an example:
#!/bin/bash
cutdfname="data11.dbf"
newname=$\(echo "$\{cutdfname\}" |tr "[A-Z]" "[a-z]" |tr "[a-z]\#_@-" "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" |tr -s "x"\)
num=$\(echo $newname |cut -d"." -f1|awk -F"x" '\{print $NF\}'\)
if [ -z "$\{num\}" ] ; then
num=1
newnum=$\(\(num\+1\)\)
finaldfname=$\(echo $cutdfname|sed -e "s/\\./$newnum\\./g"\)
else
newnum=$\(\(num\+1\)\)
finaldfname=$\(echo $cutdfname|sed -e "s/$num\\./$newnum\\./g"\)
fi
echo "$cutdfname -> $finaldfname"
fulldfname=$lastdf/$finaldfname
echo "fulldfname is $fulldfname"
./cal_file_name.bsh
data11.dbf -> data12.dbf
fulldfname is /data12.dbf
but it failed only if datafile name like: 09
for example:
#!/bin/bash
cutdfname="data09.dbf"
newname=$\(echo "$\{cutdfname\}" |tr "[A-Z]" "[a-z]" |tr "[a-z]\#_@-" "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" |tr -s "x"\)
num=$\(echo $newname |cut -d"." -f1|awk -F"x" '\{print $NF\}'\)
if [ -z "$\{num\}" ] ; then
num=1
newnum=$\(\(num\+1\)\)
finaldfname=$\(echo $cutdfname|sed -e "s/\\./$newnum\\./g"\)
else
newnum=$\(\(num\+1\)\)
finaldfname=$\(echo $cutdfname|sed -e "s/$num\\./$newnum\\./g"\)
fi
echo "$cutdfname -> $finaldfname"
fulldfname=$lastdf/$finaldfname
echo "fulldfname is $fulldfname"
./cal_file_name.bsh
./cal_file_name.bsh: 09: value too great for base (error token is "09")
data09.dbf ->
fulldfname is /
can someone tune it to be perfect?
Thank you and have a nice weekend!
How about...
$ cat newname
#! /usr/local/bin/bash
shopt -s extglob
for name ; do
suffix=${name#*.}
main=${name%.$suffix}
prefix=${main%%+([0-9])}
num=${main#$prefix}
num=10#${num}
newnum=$((num+1))
newname=${prefix}${newnum}.${suffix}
echo $name "->" $newname
done
exit 0
$
$
$ ./newname abc111.dbf 0.dbf 09.dbf qwerty09.dbf
abc111.dbf -> abc112.dbf
0.dbf -> 1.dbf
09.dbf -> 10.dbf
qwerty09.dbf -> qwerty10.dbf
$
Perderado:
Your code does not work for me.
First it not gets prefix by:
prefix=${main%%+([0-9])}
result is the $main
After that it does not take a number.
Can you give some explanation how you works with ${name}
It is not understandable how you have name broken on parts by that sintaxis.
Thank you
Note that posted the results of the test I performed with my code. It works for me. Did you leave out that shopt statement? That would make it fail.
Perderabo - I beleive you that your code does work, therefore I have asked about some comments: what those characters mean and how that happened?
I could not fine any reasonable explanation. I see you using regular expresion filtering and setting extglob additionaly the extended reg-expr, but I could not understand meaning of useg characters.
Also it is surprizing to use a reg-expr inside of a variable name. That also is not obviose how it is works.
YOu are right, after setting the extglob option it is working fine.
Would you, please, give some explanation on parsing the name by different exprecion?!
Thank you!
I have undestood the used syntax (with help from another person)
and replay to my question by myself.
It is parameter expansion POSIX shell parameter expansions
And that means:
suffix=${name#*.}
- # remove shortest part from beginning for matching *. - so for name="abc.def.gh" it removes the "abc." and returtns "def.gh", although "abc.def." is also matching the *.
So, this statement means - everything after first dot.
main=${name%.$suffix}
- % remove shortest part from end for matching .$suffix - So, it is removing suffix with dot from end, and returns beginning before .
Shorter it could be done with the same result by:
main=${name##*.}
- but the suffix is used in final construction
The double % and # ( %% and ## ) means to remove longer matching, instead of shorter
Now the
prefix=${main%%+([0-9])}
means : get part before longer line of consecutive digits on end of the 'main'
: '+' - one or more repetition; [0-9] - any digits
and
num=${main#$prefix}
- obviose is that just removed in previose statement string of digits
The statement num=10#${num} adds the base of the number. Othervise the '09' would be treated as 8-base number and rase an error (9 - is out of 0-7 digits)
Acctualy, last two statement before final file name construction could be done in that construction:
newname=${prefix}$((10#$num+1)).${suffix}
The '$((' and '))' define arithmetic calculation, '10#' before variable annonce the base for number.