Comment utiliser la ligne de commande bash pour ajouter & # 8220; import package.name. *; & # 8221; à beaucoup de fichiers java?

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

Question

Je pense utiliser find ou grep pour collecter les fichiers, et peut-être tenter de faire le changement, mais que faire avec la sortie? Ou serait-il préférable d'utiliser " argdo " à vim?

Remarque: cette question demande des solutions en ligne de commande, pas des IDE. Les réponses et commentaires suggérant que les IDE seront signalés calmement, poliment et sereinement. : -)

Était-ce utile?

La solution

vous pouvez utiliser sed pour insérer une ligne avant la première ligne du fichier:

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

utilisez une boucle for pour parcourir tous vos fichiers et y exécuter cette expression. mais soyez prudent si vous avez des packages, car les instructions import doivent figurer après la déclaration du package. vous pouvez utiliser une expression sed plus complexe, si c'est le cas.

Autres conseils

Je suis un grand fan de ce qui suit

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 est diabolique et cela finira par vous avoir. Mais j'utilise cette même construction pour beaucoup de choses et c'est mon couteau utilitaire de prédilection.

Mettre à jour : cette méthode sauvegarde également les fichiers que vous devez créer à l'aide de n'importe quelle méthode. De plus, il n'utilise rien d'autre que les fonctionnalités du shell. Vous n'avez pas besoin de vous rappeler les outils que vous n'utilisez pas souvent. C'est assez simple d'enseigner à un singe (et de me croire je dois). Et vous êtes généralement assez sage pour le jeter car il a fallu quatre secondes pour écrire.

Je suggérerais sed -i pour éviter d'avoir à vous soucier de la sortie. Puisque vous ne spécifiez pas votre plate-forme, consultez vos pages de manuel; la sémantique de sed -i varie de Linux à BSD.

J'utiliserais sed s'il y avait un moyen décent de le faire "pour la première ligne seulement" mais je ne sais pas d'un sur le haut de ma tête. Pourquoi ne pas utiliser Perl à la place. Quelque chose comme:

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

devrait faire le travail. Pour plus de détails, consultez perlrun (1) .

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

Devrait le faire. -i effectue un remplacement sur place et .old enregistre l'ancien fichier au cas où quelque chose se passerait mal. Remplacez l'itérateur * java si nécessaire (peut-être 'find. | Grep java' ou quelque chose à la place.)

Vous pouvez également utiliser la commande ed pour effectuer une recherche dans le fichier et la remplacer:

# delete all lines matching foobar 
ed -s test.txt <<< 

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

g/foobar/d\nw'

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

J'ai commencé à le faire en utilisant " argdo " dans vim. Tout d’abord, définissez les arguments:

:args **/*.java

Le " ** " parcourt tout le sous-répertoire, et le "args" les définit comme la liste d'arguments (comme si vous aviez démarré vim avec tous ces fichiers comme arguments de vim, par exemple: vim package1 / One.java package1 / Two.java package2 / One.java)

Puis manipulez les commandes dont j'ai besoin pour effectuer la transformation souhaitée, par exemple:

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

Le package "/ ^;. * $ /" agit comme une adresse pour les " s /// " ordinaires la substitution qui la suit; le " / $ / " correspond à la fin de la ligne du paquet; le " \ r " est d'obtenir une nouvelle ligne.

Maintenant, je peux automatiser cela sur tous les fichiers, avec argdo. Je clique sur ":", puis sur le haut pour obtenir la ligne ci-dessus, puis insère "argdo". alors ça devient:

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

Ce " argdo " applique cette transformation à chaque fichier de la liste d'arguments.

Ce qui est vraiment bien avec cette solution, c’est qu’elle n’est pas dangereuse: elle n’a pas encore changé les fichiers, mais je peux les consulter pour confirmer que c’est ce que je voulais. Je peux annuler des fichiers spécifiques ou quitter si je n'aime pas ce qu'il a fait (BTW: j'ai mappé ^ n et ^ p sur: n et: N afin de pouvoir parcourir rapidement les fichiers). Maintenant, je les engage avec ":: wa " - "écrire tout" fichiers.

:wa

À ce stade, je peux toujours annuler des fichiers spécifiques ou les affiner au besoin.

Cette même approche peut être utilisée pour d'autres refactorisations (par exemple, modifier une signature de méthode et les appeler dans de nombreux fichiers).

BTW: C'est maladroit: " s / $ / \ rtext / " ... Il doit y avoir un meilleur moyen d'ajouter du texte à partir de la ligne de commande de vim ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top