2009-10-05 13 views
2

J'utilise sed pour remplacer le texte dans les fichiers. Je veux donner à sed un fichier qui contient toutes les chaînes à rechercher et à remplacer dans un fichier donné.Commande sed simple pour plusieurs substitutions?

Il passe en revue les fichiers .h et .cpp. Dans chaque fichier, il recherche les noms de fichiers qui y sont inclus. S'il est trouvé, il remplace par exemple "a.h" par "<a.h>" (sans les guillemets).

Le script est la suivante:

For /F %%y in (all.txt) do 
    for /F %%x in (allFilesWithH.txt) do 
     sed -i s/\"%%x\"/"\<"%%x"\>"/ %%y 
  • ALL.TXT - Liste des fichiers à faire la substitution dans les
  • allFilesWithH.txt - Tous les noms comprennent à rechercher

Je ne veux pas lancer sed plusieurs fois (comme le nombre de noms de fichiers dans input.txt.) Mais je veux lancer une seule commande sed et lui transmettre input.txt en entrée.

Comment puis-je le faire? P.S Je cours sed du shell de développement de VxWorks, ainsi il n'a pas toutes les commandes que la version de Linux fait.

+0

Le script est-il répertorié comme un script Windows BAT? Ou quelque chose dans le shell VxWorks Development? –

+0

oui c'est un fichier batch (BAT) – Asaf

Répondre

4

sed lui-même n'a pas la capacité de lire les noms de fichiers à partir d'un fichier. Je ne suis pas familier avec le shell VxWorks, et j'imagine que cela a quelque chose à voir avec le manque de réponses ... Donc, voici quelques choses qui fonctionneraient dans bash - peut-être que VxWorks supportera l'une de ces choses.

sed -i 's/.../...' `cat all.txt` 

sed -i 's/.../...' $(cat all.txt) 

cat all.txt | xargs sed -i 's/.../...' 

Et vraiment, il n'y a pas grand-chose à invoquer sed plusieurs fois si elle fait le travail:

cat all.txt | while read file; do sed -i 's/.../.../' $file; done 

for file in $(cat all.txt); do # or `cat all.txt` 
    sed -i 's/.../.../' $file 
done 
+0

Merci, je vais essayer. C'est un gros problème car cela prend trop de temps et trop de mémoire à faire. C'est pourquoi j'ai cherché un autre moyen. J'espère que cela aiderait. Je vous remercie. – Asaf

+0

En cours d'exécution sed encore et encore n'utilisera plus de mémoire que de l'exécuter une fois. Il faudra un peu plus de temps pour s'exécuter car il y a de la surcharge dans la génération de nouveaux processus, et je suppose aussi que l'expression rationnelle est construite à chaque fois. Si vous êtes désespéré d'éviter cette surcharge, l'utilisation de Perl au lieu de sed pourrait être plus rapide. – Tim

+0

D'accord. Les invocations séquentielles multiples ne peuvent pas augmenter l'utilisation de la mémoire, surtout pas avec un programme comme sed qui fonctionne ligne par ligne. Le temps, bien sûr, sera affecté. Bien sûr, si vous avez assez de petits fichiers (s'ils sont gros, le remplacement est la plupart du temps) pour que ce soit un problème, vous pourriez entrer dans le régime trop long de la ligne de commande. En tout cas, c'est pourquoi j'ai fourni les premières méthodes. Je suppose que le shell n'a pas de substitution de commande, alors? – Cascabel

0

Ce que je ferais est de changer allFilesWithH.txt en une commande sed avec sed.

(Lorsque forcé d'utiliser sed. Je réellement utiliser Perl à la place, il peut aussi faire la recherche de fichiers * .h.)

5

Vous pouvez éliminer l'une des boucles si sed n'a besoin que d'être appelé une fois par fichier. Utilisez l'option -f pour spécifier plus d'une substitution:

For /F %%y in (all.txt) do 
    sed -i -f allFilesWithHAsSedScript.sed %%y 

allFilesWithHAsSedScript.sed dérive de allFilesWithH.txt et contiendrait:

s/\"file1\"/"\<"file1"\>"/ 
s/\"file2\"/"\<"file2"\>"/ 
s/\"file3\"/"\<"file3"\>"/ 
s/\"file4\"/"\<"file4"\>"/ 

(Dans l'article Common threads: Sed by example, Part 3 il existe de nombreux exemples de scripts sed avec des explications .)

Ne soyez pas confus (jeu de mots).

+1

Merci, c'est une belle façon :) – Asaf

Questions connexes