Usando linha de comando bash, como adicionar “package.name importação. *;” para muitos arquivos java?

StackOverflow https://stackoverflow.com/questions/1025116

Pergunta

Eu estou pensando em usar find ou grep para coletar os arquivos, e talvez sed para fazer a mudança, mas o que fazer com a saída? Ou seria melhor usar "argdo" no vim?

Nota: esta questão está pedindo soluções de linha de comando, não IDE. Respostas e comentários sugerindo do IDE será calmamente, educadamente e serenamente sinalizado. : -)

Foi útil?

Solução

Você pode usar sed para inserir uma linha antes da primeira linha do arquivo:

sed -ie "1i import package.name.*;" YourClass.java

usar um loop for para percorrer todos os seus arquivos e executar essa expressão sobre eles. mas tenha cuidado se você tiver pacotes, porque as declarações import deve ser após a declaração pacote. você pode usar uma expressão sed mais complexa, se esse for o caso.

Outras dicas

Eu sou grande fã da seguinte

export MYLIST=`find . -type f -name *.java`
for a in $MYLIST; do
   mv $a $a.orig
   echo "import.stuff" >> $a
   cat $a.orig >> $a
   chmod 755 $a 
done;

mv é mau e, eventualmente, isso vai te pegar. Mas eu usar esta mesma construção para um monte de coisas e é minha faca de serviço público de escolha.

Update: Este método também faz backup dos arquivos que você deve fazer uso de qualquer método. Além disso ele não usa nada, mas os recursos do shell. Você não tem que refrescar sua memória sobre as ferramentas que você não usa com frequência. É bastante simples para ensinar um macaco (e acredite em mim eu tenho) para fazer. E você geralmente são sábios o suficiente para simplesmente jogá-lo fora porque levou quatro segundos para gravação.

Eu sugiro sed -i para evitar a necessidade de se preocupar com a saída. Desde que você não especificar a sua plataforma, verifique as páginas do homem; a semântica de sed -i variar de Linux para BSD.

Gostaria de usar sed se havia uma maneira decente para tão "fazer isso para a primeira linha única", mas eu não sei de um fora do topo da minha cabeça. Por que não usar perl vez. Algo como:

find . -name '*.java' -exec perl -p -i.bak -e '
    BEGIN {
      print "import package.name.*;\n"
    }' {} \;

deve fazer o trabalho. Verifique perlrun(1) para mais detalhes.

for i in `ls *java`
do 
  sed -i '.old' '1 i\
  Your include statement here.
  ' $i
done

Deve fazê-lo. -i faz um substituto lugar e old salva o arquivo antigo apenas no caso de algo der errado. Substitua o iterator * java conforme necessário (talvez 'encontrar |. Grep java'. Ou algo em vez disso)

Você também pode usar o comando ed para fazer pesquisa em arquivos e substituir:

# delete all lines matching foobar 
ed -s test.txt <<< $'g/foobar/d\nw' 

ver: http://bash-hackers.org /wiki/doku.php?id=howto:edit-ed

Eu realmente começando a fazê-lo usando "argdo" no vim. Em primeiro lugar, definir os argumentos:

:args **/*.java

O "**" percorre todo o subdir, e os "args" define-los para ser a lista arg (como se você começou vim com todo esses arquivos como argumentos para vim, por exemplo: vim package1 / One.java package1 /Two.java package2 / One.java)

Em seguida, mexer com o que quer que comanda Eu preciso fazer a transformação que eu quero, por exemplo:

:/^package.*$/s/$/\rimport package.name.*;/

O "/^package.*$/" atua como um endereço para o comum "s ///" substituição que se segue; o "/ $ /" corresponde ao fim da linha do pacote; o "\ r" é obter uma nova linha.

Agora eu pode automatizar este sobre todos os arquivos, com argdo. I hit ":", então uparrow para obter a linha acima, em seguida, insira "argdo" assim torna-se:

:argdo /^package.*$/s/$/\rimport package.name.*;/

Esta "argdo" aplica-se que transformam a cada arquivo na lista de argumentos.

O que é realmente agradável sobre esta solução é que ele não é perigoso: não mudou realmente os arquivos ainda, mas posso olhar para eles para confirmar que fiz o que queria. I pode desfazer em arquivos específicos, ou eu posso sair se eu não gosto do que ele é feito (BTW: Eu mapeou ^ n e ^ p a: ne: N para que eu possa fugir rapidamente através dos arquivos). Agora, eu os entrego com ": wa" - "escrever todos os" arquivos

.
:wa

Neste ponto, eu ainda posso arquivos desfazer específicos, ou finesse-los quando necessário.

Esta mesma abordagem pode ser usada para outros refatorações (por exemplo, alterar a assinatura do método e chamadas para ele, em muitos arquivos).


BTW: Este é desajeitado: "s/$/\rtext/" ... Deve haver uma maneira melhor de texto de acréscimo de vim comando ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top