2009-06-22 6 views
2

Je pense à l'aide de trouver ou grep pour recueillir les fichiers, et peut-être sed pour faire le changement, mais ce qu'il faut faire avec la sortie? Ou serait-il préférable d'utiliser "argdo" dans vim?En utilisant la ligne de commande bash, comment ajouter "import package.name. *;" à de nombreux fichiers Java?

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

Répondre

1

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

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

utiliser une boucle pour parcourir tous vos fichiers et exécuter cette expression sur eux. mais soyez prudent si vous avez des paquets, car les instructions import doivent être après la déclaration du paquet. vous pouvez utiliser une expression sed plus complexe, si c'est le cas.

+0

Merci, c'est ce que j'ai trouvé après avoir vu la réponse du chaos, sauf pour l'espace non significatif entre "1i" et "import". Je ne savais pas que c'était autorisé - c'est beaucoup plus clair. sed peut ajouter après les lignes correspondantes, comme sed -ie "/^paquet/un import package.name. *;" Eg.java # mais il va correspondre à toute autre ligne commençant par package aussi, pas seulement la première ... – 13ren

1

Je vous suggère sed -i pour éviter la nécessité de se soucier de la sortie. Puisque vous ne spécifiez pas votre plate-forme, vérifiez vos pages de manuel; la sémantique de sed -i varie de Linux à BSD.

+0

Merci, je ne savais pas. (J'ai essayé de rediriger la sortie vers le fichier d'origine, mais cela fait zéro longueur). – 13ren

1

J'utiliseraient sed s'il y avait une manière décente si « le faire pour la première ligne que » mais je ne sais pas d'un hors du 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. Vérifiez perlrun(1) pour plus de détails.

+0

Merci, je suis d'accord que Perl est un choix judicieux pour ce genre de traitement de texte, même si je viens de faire sed pour faire la partie insertion: sed -ie '1i \ nimport package.name. *;' Eg.java # "1" est la première ligne; "i" est inséré – 13ren

+0

Nice. Je ne me souviens pas si vous pourriez utiliser un numéro de ligne vide comme une adresse dans sed ou non. L'autre choix aurait été awk, mais j'ai tendance vers perl si ce n'est pas une substitution basique. –

1

Je suis 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 mal et finalement ce que vous obtiendrez. Mais j'utilise cette même construction pour beaucoup de choses et c'est mon couteau utilitaire de choix.

Mise à jour: Cette méthode sauvegarde également les fichiers que vous devez faire avec n'importe quelle méthode. De plus, il n'utilise rien d'autre que les fonctionnalités du shell. Vous n'avez pas à vous souvenir des outils que vous n'utilisez pas souvent. C'est assez simple pour apprendre à un singe (et croyez-moi que j'ai) à faire. Et vous êtes généralement assez sage pour simplement le jeter parce qu'il a fallu quatre secondes pour écrire.

+0

Je voulais éviter les fichiers temporaires, mais vous avez raison: si ça marche, pourquoi pas? – 13ren

+0

Son seul avantage est qu'il n'a besoin de rien d'extérieur de la fonctionnalité de coquilles. Cela fonctionne dans bash et ksh et c'est plus rapide que d'aller rafraichir votre esprit sur Perl et autres petites choses idiotes. – ojblass

+0

De bons points dans votre mise à jour, particulièrement en ce qui concerne la sauvegarde en tant qu'effet secondaire. – 13ren

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

Devrait le faire. -i fait un remplacement sur place et .old enregistre l'ancien fichier juste au cas où quelque chose ne va pas. Remplacez le iterator * java si nécessaire (. Peut-être. Trouver | grep java »ou quelque chose à la place)

+0

Merci, ça doit être la partie [SUFFIX] de la page man - ça a plus de sens après avoir vu un exemple. – 13ren

0

Je l'ai fait de commencer à le faire en utilisant « argdo » dans vim. Tout d'abord, définissez les args:

:args **/*.java 

Le « ** » traverse toutes les subdir et les « args » les jeux à la liste de arg (comme si vous lanciez vim avec tous ces fichiers comme arguments à vim, par exemple: vim package1/One.java package1/Two.java package2/One.java)

Puis violon avec tout ce que les commandes que je dois faire la transformation que je veux, par exemple:

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

Les actes de « /^package.*$/ » comme une adresse pour le s » ordinaire ///"substitution qui le suit; le "/ $ /" correspond à la fin de la ligne du paquet; le "\ r" est d'obtenir un retour à la ligne.

Maintenant, je peux automatiser cela sur tous les fichiers, avec argdo. Je frappe « : », puis uparrow pour obtenir la ligne ci-dessus, puis insérez « argdo » il devient:

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

Ce « argdo » applique et que chaque fichier à transform dans la liste des arguments.

Ce qui est vraiment bien au sujet de cette solution est qu'il est pas dangereux: il n'a pas réellement changé les fichiers encore, mais je peux les regarder pour confirmer qu'il a fait ce que je voulais. Je peux annuler sur des fichiers spécifiques, ou je peux quitter si je n'aime pas ce qui est fait (BTW: J'ai mappé^n et^p à: n et: N afin que je puisse parcourir rapidement les fichiers). Maintenant, je les commets avec ": wa" - "écrire tous" les fichiers. À ce stade, je peux encore annuler des fichiers spécifiques, ou les finesse selon les besoins.

Cette même approche peut être utilisée pour d'autres refactoring (changer par exemple une signature de méthode et demande à elle, dans de nombreux fichiers).


BTW: Ceci est maladroit: « s/$/\rtext/ » ... Il doit y avoir une meilleure façon d'ajouter du texte de la ligne de commande de vim ...

+0

Pour le refactoring général, vous devriez honnêtement prendre l'éclipse pour un tour si vous allez ouvrir un IDE. Je suis un énorme bigot VIM (voir mon avatar), mais les interfaces graphiques qui supportent les langages activés vararg seront vraiment votre perte, car j'ai appris à faire presque la même chose que ci-dessus. – ojblass

+0

Eh bien, je ne prendrais pas ça de n'importe qui d'autre mais vu votre avatar ... :-) Je ne comprends pas votre deuxième phrase: Que voulez-vous dire par "vararg" les langues activées étant votre perte? (J'utilise Java, mais je n'utilise pas les arguments variables très souvent) – 13ren

Questions connexes