Xarg separati da Newline


41

È possibile xargsutilizzare solo newline come separatore? (in bash su Linux e OS X se questo è importante)

So che -0può essere usato, ma è PITA poiché non tutti i comandi supportano output delimitati da NUL.


Che cosa stai cercando di realizzare. Potrebbe esserci un altro modo di procedere.
In pausa fino a nuovo avviso.

@Dennis Lo uso per varie cose, spesso in pipeline con grep, sed, awk molto semplice ecc., Principalmente per parallelizzare l'esecuzione. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4è troppo da digitare rispetto a ls *.foo | xargs -P4.
Kornel,

Gli script e le funzioni sono due modi eccellenti per ridurre la digitazione.
In pausa fino a nuovo avviso.

Questa è una domanda SO, vero?
Charles Stewart,

Risposte:


17

Qualcosa sulla falsariga di

alias myxargs='perl -p -e "s/\n/\0/;" | xargs -0'
cat nonzerofile | myxargs command

dovrebbe funzionare.


38
tr '\n' '\0'funziona anche.
Kornel,

2
perl è eccessivo per un singolo personaggio. trè più veloce sia per la cpu che per le dita.
Ciao mondo,

53

GNU xargs (predefinito su Linux; installa findutilsda MacPorts su OS X per ottenerlo) supporta -dche ti consente di specificare un delimitatore personalizzato per l'input, in modo da poter fare

ls *foo | xargs -d '\n' -P4 foo 

Ho alias xxargs="xargs -d '\n'"nel mio bashrc. Quindi posso fare solo cose del genere:grep -IRl foo | xxargs sed -i s/foo/bar/g
Tylerl,

4
Questa dovrebbe davvero essere la risposta accettata. Non è necessario uscire perl. Anche se trè una buona idea.
Ehtesh Choudhury,

3
brew install findutilsed gxargsera esattamente ciò di cui avevo bisogno su OS X, grazie.
Brad Koch,

5

Con Bash, in genere preferisco evitare xargs per qualsiasi cosa un po 'meno complicata, a favore di cicli while-read. Per la tua domanda, while read -ar LINE; do ...; donefa il lavoro (ricorda di usare la sintassi dell'array con LINE, ad es. ${LINE[@]}Per l'intera riga). Questo non ha bisogno di alcun trucco: per impostazione predefinita read utilizza esattamente \ncome il carattere di terminazione di riga.

Dovrei pubblicare una domanda su SO sui pro e contro degli xargs contro i loop while-read ... fatto!


2
Questo può solo emulare xargs -n1 -d'\n'e non il tutto xargs.
Ciao mondo,

@HelloWorld - Puoi raggruppare gli argomenti abbastanza facilmente, così puoi anche simulare xargs -n$Ncon solo un po 'di script extra.
Charles Stewart,

Sì, sono tra i votanti, è solo un'osservazione degna di nota.
Ciao mondo,

Questo è esattamente quello che faccio! Inoltre, puoi usare le readopzioni, come leggere più parole in variabili separate o cambiare delimitatore con IFS=' '.
caesarsol,

0

Non con la versione standard. Ho una versione compromessa che lo fa - l'ho usata prima di sapere ' find ... -print0 | xargs -0 ...'. Contattami se vuoi una copia - vedi il mio profilo. (Nessuna scienza missilistica, ma fa quasi tutto il lavoro. Non è una replica completa di xargs.)


0

Che dire di cat file | xargs | sed 's/ /\n/ig'questo convertirà gli spazi in newline, usando gli strumenti bash standard di Linux.


Se filecontiene spazi e nuove righe, il risultato di questo comando renderà impossibile distinguerli, il che sembra andare nella direzione opposta a quella che questa domanda richiede
Max Nanasy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.