2010-09-20 8 views
8

Sto correndo una riga di comando in questo modo:Cambia il separatore di linee sed a NUL per agire come prefiltro "xargs -0"?

filename_listing_command | xargs -0 action_command 

Dove filename_listing_command usa byte nulli per separare i file - questo è ciò che xargs -0 vuole consumare.

Il problema è che voglio filtrare alcuni file. Qualcosa di simile a questo:

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

ma ho bisogno di usare xargs -0.

Come si modifica il separatore di linea che sed desidera da newline a NUL?

risposta

4

tubo attraverso grep:

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

Il -z accetta terminatori Null in ingresso e la -Z produce terminatori Null sulla produzione e la -v inverte la partita (esclude).

Edit:

Prova questa, se si preferisce utilizzare sed:

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

La soluzione 'sed' si rompe ancora su' \ n', quindi se un nome file contiene '\ n' e finisce in' .py', solo la parte dopo '\ n' sarà cancellata. Ad esempio, 'printf '% s \ 0' $ 'abc \ ndef.py' | sed 's/[^ \ x0] * \. py \ x0 // g'' stamperà 'abc \ n'. Ciò annulla lo scopo dell'utilizzo di terminatori nulli. – musiphil

+0

Nel mio caso, il mio comando (per '\ n' terminators) era' sed -ne '/^UU // p'', e non potevo convertirlo facilmente in un comando 'grep'. – musiphil

+0

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

1

Se nessuno dei nomi di file contiene ritorno a capo, allora può essere più facile da leggere una soluzione che utilizza GNU parallelo:

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

Per saperne di più su GNU Parallel http://www.youtube.com/watch?v=OpaiGYxkSuQ

012.
9

Se hai trovato questo SO cercando una risposta e stai usando GNU sed 4.2.2 o successivo, ora ha un'opzione -z che fa quello che l'OP sta chiedendo.

Problemi correlati