Como renomear arquivos usando sed?

1

Esta é uma expressão sed que foi criada por um colaborador aqui. Mais especificamente por @ craig-sanders.

$ FileToMove está definido como "2012-09-01 Home insurance quote_zz20.pdf"

# use sed to extract folder number from filename.
FolderNo=$(echo "$FileToMove" | sed -r -e 's/.*zz([0-9]+)\.pdf//')
# On my Mac, I figured that this command needs to be FolderNo=$(echo "$FileToMove" | sed -E -e 's/.*zz([0-9]+)\.pdf//')

O comando acima é usado para extrair "20" do nome do arquivo. Agora quero substituir zz20 por nulo.

Estou tentando fazer isso. Vai aprender sed e antes disso precisa aprender expressões regulares. Enquanto isso, tenho certeza de que é super fácil substituí-lo por null. Alguma dica?

    
por jim70 01.09.2012 / 23:01

3 respostas

2

Suponho que você deseja renomear o arquivo e movê-lo.

Usando meu original script como base, altere esta parte do script:

if [ "$NumFolders" -eq 1 ] ; then 
  mv "$ParentFolder/$FileToMove" "$TargetFolder/" 
else

para algo assim:

if [ "$NumFolders" -eq 1 ] ; then
  NewFileName=$(echo "$FileToMove" | sed -E -e 's/_zz[0-9]+\././')
  mv "$ParentFolder/$FileToMove" "$TargetFolder/$NewFileName" 
else

Traduzindo o regex para verbose inglês, o script sed substitui "a primeira ocorrência na linha de entrada de '_zz seguido por um ou mais dígitos seguidos por um literal full-stop'" com apenas um ponto final.

i.e. como a resposta de Ben, não fará a coisa certa com um arquivo que tenha duas ou mais sequências '_zz20 ...'. Fácil o suficiente para substituí-lo com o regexp do Birei (exceto se livrar da palavra 'null' entre \ 1 e \ 2, que irá substituí-lo com a string literal 'null'):

NewFileName=$(echo "$FileToMove" | sed -E -e 's/^(.*)zz[0-9]+(\.pdf)$//')

BTW, isso poderia ter sido feito com uma linha e sem a variável temporária ($ NewFileName), mas é mais fácil entender dessa maneira.

    
por 03.09.2012 / 15:58
1

Se eu entendi sua pergunta, você não quer extrair nada, apenas para substituir a string literal zz20 with null . Um caminho:

FolderNo=$(echo "$FileToMove" | sed -r -e 's/^(.*)zz[0-9]+(\.pdf)$/null/')

Ele salva no grupo 1 todos os caracteres até o zz20 e no grupo 2 todos os caracteres após a partida. Os únicos caracteres não salvos serão zz20 que serão perdidos e substituídos por null .

    
por 01.09.2012 / 23:38
1

Se você pretende substituir com o conceito de null, em vez do texto "null", você pode usar isto:

$ FolderNo=$(sed 's/_zz20//' <<< "2012-09-01 Home insurance quote_zz20.pdf")
$ echo $FolderNo
2012-09-01 Home insurance quote.pdf

Isso substituirá a primeira ocorrência de _zz20 por nada. Isso ocorre porque a segunda parte do argumento para sed está vazia ( s/search/replace/ = > s/_zz20// ).

Meu exemplo não é tão cuidadoso quanto o que você cita, e o que o @Birei sugere. Se algum dos seus arquivos tiver várias sequências de caracteres '_zz20', as coisas não ficarão bem.

    
por 02.09.2012 / 04:00