Tendo problemas para substituir um hífen específico em diretórios que seguem um formato específico no Bash

1

Eu tenho uma lista de diretórios usando o formato:

2014-12-03 13-03
2014-09-03 12-07

etc.

Eu preciso alterá-los para:

2014-12-03 13:03
2014-09-03 12:07

Estou tentando fazer isso com for d in *\ ??-??; do mv "$d" "$d//<something>/<something>"; done mas não sei como fazer isso a.) sem substituir cada “-“ por um “:” e b.) tendo os caracteres referenciados pelo caractere? s e preservá-los. Meus esforços até agora resultaram em cólons substituindo todos os hífens, ou com cada série de [dois pontos] [número] [número] resultando em ": ??" impresso literalmente.

Alguém pode me explicar como fazer isso ou me indicar a documentação que explica como fazer referência a caracteres correspondentes para usá-los na substituição?

Além disso, você também pode me dizer qual sintaxe eu preciso adicionar se eu quiser fazer isso de forma recursiva?

    
por rrr45 08.12.2014 / 22:03

2 respostas

0

Eu não acho que você pode fazer isso com a expansão do parâmetro bash, mas aqui está uma maneira:

$ d="2014-12-03 13-03"
$ new=$(sed -r 's/-([^-]+)$/:/' <<< "$d")
$ echo "$new"
2014-12-03 13:03

Apenas com bash, usando um regex e capturando:

$ [[ $d =~ (.*)\ (..)-(..)$ ]] &&  printf -v new "%s %s:%s" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
$ echo "$new"
2014-12-03 13:03
    
por 09.12.2014 / 19:38
0

Outra maneira:

find . -type d -name "2014*" -print0 | while read -d $'
find . -type d -name "2014*" -print0 | while read -d $'%pre%' file
do
    mv "$file" "$(echo $file | sed -r s/\(.*\)-\([^-]+\)$/\1:\2/g)"
done
' file do mv "$file" "$(echo $file | sed -r s/\(.*\)-\([^-]+\)$/\1:\2/g)" done
    
por 10.12.2014 / 11:40