DataPipeline - Substituição repetida que possui problemas com sed (conforme explicado) e precisa gravar arquivos em um novo local

0

Eu preciso executar uma operação de substituição global (repetida) no texto de arquivos recursivamente em um diretório, mas há algumas restrições que me deram problemas:

  1. Eu preciso substituir de uma forma que inclua um caractere de nova linha, que interrompe o sed, como mencionado aqui: Por que o sed está me dando um erro sobre um 'não-terminado'?
  2. Eu preciso produzir os arquivos em um diretório diferente porque estou usando o AWS DataPipeline e preciso solucionar um problema que estava ocorrendo devido a alterações nos arquivos do InputDirectory durante a execução do comando. (Portanto, preciso gravar cada arquivo modificado em um arquivo com o mesmo nome de arquivo, mas localizado no OutputDirectory.)
  3. Também tive problemas ao tentar reduzir o nome do arquivo de saída

Então, fico com algo que talvez fosse:

  1. use find para enumerar os arquivos
  2. percorra os arquivos e, para cada arquivo, substitua o caminho de entrada pelo caminho de saída (talvez até com sed )
  3. cat o arquivo e canaliza o conteúdo para awk e grava o conteúdo no caminho atualizado.
  4. constrói os diretórios necessários no processo (que, acredito, devem acontecer automaticamente a partir do redirecionamento de saída, mas quero explicá-lo apenas no caso)

Existe uma maneira simples de fazer isso?

    
por devinbost 17.01.2018 / 05:51

1 resposta

0

  1. Se você usar o GNU sed , poderá usar \n para nova linha na string de substituição. Com outro sed , use uma nova linha literal, mas escape com uma barra invertida.

  2. use find ... -print | sed -e 's:oldpath:newpath:' em vez de um loop de shell para alterar os caminhos.

    Se oldpath ou newpath contiver : caracteres, use um delimitador diferente.

    E se algum dos nomes de arquivo puder conter um caractere de nova linha (que é IS um caractere de nome de arquivo válido) e o GNU sed estiver disponível (padrão / padrão no linux), use a opção -print0 do find em vez de -print e -z da opção do GNU sed: sed -z -e 's:oldpath:newpath:'

  3. você pode criar o caminho do diretório com algo como mkdir -p "$(dirname "$filename")" para cada nome de arquivo de entrada.

  4. por que não usar apenas rsync -a sourcedir destdir , opcionalmente com algumas opções relevantes --exclude e / ou --include ?

por 17.01.2018 / 06:33