Comment pouvez-vous canaliser la sortie de tri à un xargs combiné, -exec?

S'il vous plaît nu avec moi pendant que j'essaie d'exprimer le problème.

J'ai un fichier avec une liste d'entrées ".m", comme ceci

Foo.m
  Bar.m

Je veux remplacer chaque '.m' par '.h', trié et garder les uniques comme ça.

cat ../classes.txt | sed 's/\.m/\.h/' | sort -u

Cela me donne la même liste que les entrées '.h', c'est-à-dire

Foo.h
  Bar.h

La deuxième partie concerne l'impression vers stdout chaque fichier qui importe les en-têtes ci-dessus.

c'est-à-dire pour une entrée simple, il semble que

echo Foo.h | xargs -I file find Classes -name \*.m -exec grep -q 'import "file' {} \; -print

Cependant, lorsque je passe la sortie du premier au second, je n'ai rien sur la sortie standard.

c'est à dire.

cat ../classes.txt | sed 's/\.m/\.h/' | sort -u | xargs -I file find Classes -name \*.m -exec grep -q 'import "file' {} \; -print

Ce qui donne?

0
ajouté
Vues: 1
@ 1_CR pas une faute de frappe. Il est là pour correspondre à #import "Foo.h"
ajouté l'auteur qnoid, source
Est-ce que " dans " fichier est une faute de frappe?
ajouté l'auteur iruvar, source
Ça semble fonctionner ici. Assurez-vous que vos chemins sont corrects? Vous pouvez aussi utiliser tee entre vos pipes pour 'voir' ce qui les traverse, par ex. .. trier -u | tee/dev/stderr | xargs ..
ajouté l'auteur damienfrancois, source
Essayez d'utiliser xargs -t (commande d'impression vers stderr) pour voir si chaque commande qu'elle émet est conforme à vos attentes.
ajouté l'auteur adurdin, source

2 Réponses

Je ne suis pas sûr que je suis assez pour répondre pourquoi vous voyez le comportement que vous voyez, mais comme une alternative, je voudrais essayer quelque chose comme ceci:

while read line; do
   find Classes -iname "*.m" -exec grep -q "import \"${line}" '{}' ;\
done < ../classes.txt | sort -u
1
ajouté

En utilisant la réponse de @ adurdin, a découvert que la commande était

{} ; -print -name *.m -exec grep -q import "Foo.h

Ce qui n'a pas beaucoup de sens. Puis s'est rendu compte que le fichier classes.txt avait des terminaisons de ligne CRLF qui l'ont fait s'étouffer.

Changer la ligne se terminant au format Unix, a fonctionné comme un charme.

0
ajouté