2010-09-20 20 views
8

Je suis en une ligne de commande comme ceci:Changer le séparateur de ligne sed en NUL pour agir comme préfiltre "xargs -0"?

filename_listing_command | xargs -0 action_command 

filename_listing_command utilise des octets nuls pour séparer les fichiers - c'est ce que xargs -0 veut consommer.

Le problème est que je veux filtrer certains fichiers. Quelque chose comme ceci:

filename_listing_command | sed -e '/\.py/!d' | xargs ac 

mais j'ai besoin d'utiliser xargs -0.

Comment changer le séparateur de ligne que sed veut de newline à NUL?

Répondre

4

tuyau à travers grep:

filename_listing_command | grep -vzZ '\.py$' | filename_listing_command 

Le -z accepte terminateurs nulles sur l'entrée et le produit -Z terminateurs nulles sur la production et la -v inverse le jeu (à l'exclusion).

Edit:

Essayez si vous préférez utiliser sed:

filename_listing_command | sed 's/[^\x0]*\.py\x0//g' | filename_listing_command 
+0

Votre solution 'sed' continue de fonctionner sur \ n, donc si un nom de fichier contient' \ n' et se termine par '.py', seule la partie après' \ n' sera supprimée. Par exemple, 'printf '% s \ 0' $ 'abc \ ndef.py' | sed 's/[^ \ x0] * \. py \ x0 // g'' affichera 'abc \ n'. Cela annule le but de l'utilisation de terminateurs NULL. – musiphil

+0

Dans mon cas, ma commande (pour '\ n' terminators) était' sed -ne 's/^ UU // p'', et je ne pouvais pas la convertir facilement en une commande 'grep'. – musiphil

+0

@musiphil: Essayez: 'grep -PzZo '^ (? <= UU). *'' –

1

Si aucun de vos noms de fichiers contiennent newline, il peut être plus facile de lire une solution à l'aide parallèle GNU:

filename_listing_command | grep -v '\.py$' | parallel ac 

En savoir plus sur GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ

9

Si vous avez atteint ce SO à la recherche d'une réponse et que vous utilisez GNU sed 4.2.2 ou une version plus récente, il a maintenant une option -z qui fait ce que l'OP demande.