Como selecionar 30 arquivos e fazer um monte de comandos sed neles

3

Eu quero novas cópias dos arquivos, por isso quero fazer algo como:

dir *.rb
foreach file
  make a copy of the file, e.g. 'blob.rb' to 'blob_processed.rb'
  do the 50 sed commands to process the blob_processed.rb file
end

Como posso fazer isso sem criar 30 arquivos que executam essas etapas (a cópia e depois todos os seds). Os seds são um pouco longos, mas funcionam e serão exatamente os mesmos para cada arquivo. Um exemplo:

sed -i "s#require "selenium-webdriver"#require 'my_helper' #" blob_processed.rb
    
por Michael Durrant 16.05.2013 / 18:00

3 respostas

4
  1. Verifique se você tem algum diretório temporário onde você escreve sua saída, porque senão você não poderá executar o comando em *.rb duas vezes sem obter blob_processed_processed.rb arquivos. Você sempre pode copiar os arquivos de saída do diretório temporário quando tudo estiver concluído e funcionando bem.

  2. coloque os nomes dos arquivos em "" para ter certeza de que você pode lidar com pelo menos nomes de arquivos com espaços neles.

  3. Escape aspas duplas dentro do comando sed com uma barra invertida ( \" )

O resultado seria algo como:

#!/bin/bash
mkdir -p tmp
for i in *.rb
do
    out=tmp/${i%.rb}_processed.rb
    cp "$i" "$out"
    sed -i "s#require \"selenium-webdriver\"#require 'my_helper' #" "$out"
done

[editar por Michael (OP)] Isso funcionou principalmente, embora eu fizesse:

#!/bin/bash
mkdir -p tmp
for i in *.rb
do
  out=tmp/${i}
  cp "$i" "$out"
done

que manteve os mesmos nomes de arquivos, mas colocou todos os novos arquivos em tmp /

    
por 16.05.2013 / 18:33
3

Você pode fazer isso muito bem exatamente assim:

for i in *.rb
do
    cp -- "$i" "processed_$i"
    sed -i 's#require "selenium-webdriver"#require '\''my_helper'\'' #' "processed_$i"
done

Além disso, se você não se importar em ser o arquivo original cujo nome muda, você pode usar a capacidade do seds de fazer backup de arquivos antes de modificá-los:

sed --in-place=.orig 's#require "selenium-webdriver"#require '\''my_helper'\'' #' *.rb
    
por 16.05.2013 / 18:05
2

Eu colocaria os comandos sed em um arquivo e passaria isso para sed . Por algum motivo, não posso fazer isso funcionar com a opção -i , mas isso não deve ser um problema, já que você está copiando de qualquer maneira. Por exemplo:

$ cat seds
s/require "selenium-webdriver"/require 'my_helper' /
s/foo/bar/
s/baz/bar/
s/hello/goodbye/

Então,

for i in *.rb
do
    sed -f seds "$i" > "processed_$i"
done
    
por 16.05.2013 / 18:39

Tags