Algo ao longo das linhas de
alias myxargs='perl -p -e "s/\n/alias myxargs='perl -p -e "s/\n/%pre%/;" | xargs -0'
cat nonzerofile | myxargs command
/;" | xargs -0'
cat nonzerofile | myxargs command
deve funcionar.
É possível fazer com que xargs
use apenas nova linha como separador? (em bash no Linux e OS X se isso importa)
Eu sei que -0
pode ser usado, mas é o PITA como nem todo comando suporta saída delimitada por NUL.
GNU xargs (padrão no Linux; instale findutils
do MacPorts no OS X para obtê-lo) suporta -d
, que permite especificar um delimitador personalizado para entrada, para que você possa fazer
ls *foo | xargs -d '\n' -P4 foo
Com o Bash, eu geralmente prefiro evitar xargs para qualquer coisa um pouco complicada, em favor dos loops while-read. Para sua pergunta, while read -ar LINE; do ...; done
faz o trabalho (lembre-se de usar a sintaxe de matriz com LINE, por exemplo, ${LINE[@]}
para toda a linha). Isso não requer nenhum truque: por padrão, read usa apenas \n
como o caractere terminador de linha.
Eu deveria postar uma pergunta sobre SO sobre os prós e contras contras de xargs x loops while-read ... feito!
Não com a versão padrão. Eu tenho uma versão hackeada que faz isso - eu a usei antes de saber sobre ' find ... -print0 | xargs -0 ...
'. Entre em contato se você quiser uma cópia - veja meu perfil. (Sem ciência de foguetes - isso praticamente faz o trabalho, no entanto. Não é uma réplica completa de xargs.)
Que tal cat file | xargs | sed 's/ /\n/ig'
converterá espaços em novas linhas, usando ferramentas bash padrão do Linux.