Search code examples
bashfilenamesuppercase

Insert period before uppercase characters


I have files whose names I want to change.

Example:

HawaiiFive02010SXXEXXW.ac3
Nashville2012SXXEXXW.ac3
HowToGetAwayWithMurderSXXEXXW.ac3
BetterCallSaulSXXEXXW.ac3
BeautyAndTheBeast2012SXXEXXW.ac3

I need to convert them:

Nashville.2012.SXXEXX.W.ac3
How.To.Get.Away.With.Murder.SXXEXX.W.ac3
Better.Call.Saul.SXXEXX.W.ac3
Beauty.And.The.Beast.2012.SXXEXX.W.ac3
Hawaii.Five.0.2010.SXXEXX.W.ac3

I found this :

echo Nashville2012SXXEXXW.ac3 | sed 's/[A-Z]/.&/g;s/^.//'
Nashville2012.SXX.EXX.W.ac3
echo HowToGetAwayWithMurderSXXEXXW.ac3 | sed 's/[A-Z]/.&/g;s/^.//'
How.To.Get.Away.With.Murder.SXX.EXX.W.ac3

If it is not possible to change the file names I would call them myself. I just want to know if this would be potentially possible to find a way but if it's too complicated I do spend since the rest of the script works :)


Solution

  • With GNU sed :

    sed -r 's/([A-Z][^A-Z.]+)/\1./g;s/[0-9]{4}/.&/g;s/([0-9])([0-9]{4})[^$]/\1.\2./;s/SXXEXXW/SXXEXX.W/;s/(S[0-9][0-9])\./\1/'
    

    Example :

    $ echo Nashville2012SXXEXXW.ac3 | sed -r 's/([A-Z][^A-Z.]+)/\1./g;s/[0-9]{4}/.&/g;s/([0-9])([0-9]{4})[^$]/\1.\2./;s/SXXEXXW/SXXEXX.W/;s/(S[0-9][0-9])\./\1/'
    Nashville.2012.SXXEXX.W.ac3
    
    $ echo HowToGetAwayWithMurderSXXEXXW.ac3 | sed -r 's/([A-Z][^A-Z.]+)/\1./g;s/[0-9]{4}/.&/g;s/([0-9])([0-9]{4})[^$]/\1.\2./;s/SXXEXXW/SXXEXX.W/;s/(S[0-9][0-9])\./\1/'
    How.To.Get.Away.With.Murder.SXXEXX.W.ac3
    
    $ echo HawaiiFive02010S03E08W.ac3 | sed -r 's/([A-Z][^A-Z.]+)/\1./g;s/[0-9]{4}/.&/g;s/([0-9])([0-9]{4})[^$]/\1.\2./;s/SXXEXXW/SXXEXX.W/;s/(S[0-9][0-9])\./\1/'
    Hawaii.Five.0.2010.S03E08.W.ac3