O que você está tentando realizar. Pode haver outra maneira de fazer isso.
Pausado até novo aviso.
@Dennis Eu o uso para várias coisas, geralmente em pipeline com grep, sed, awk muito básico etc., principalmente para paralelizar a execução. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4é demais para digitar em comparação com ls *.foo | xargs -P4.
Kornel
Scripts e funções são duas excelentes maneiras de reduzir a digitação.
Eu tenho alias xxargs="xargs -d '\n'"no meu bashrc. Então eu só posso fazer coisas como esta:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl
4
Esta realmente deve ser a resposta aceita. Não há necessidade de sair do perl. Embora também trseja uma boa ideia.
Ehtesh Choudhury
3
brew install findutilse gxargsera exatamente o que eu precisava no OS X, obrigado.
Brad Koch
5
Com o Bash, geralmente prefiro evitar xargs por qualquer coisa menos complicada, a favor de loops while-read. Para sua pergunta, while read -ar LINE; do ...; donefaz o trabalho (lembre-se de usar a sintaxe da matriz com LINE, por exemplo, ${LINE[@]}para toda a linha). Isso não precisa de nenhum truque: por padrão, a leitura usa apenas \no caractere terminador de linha.
Eu deveria postar uma pergunta no SO sobre os prós e contras do xargs x loops durante a leitura ... pronto!
Isso só pode emular xargs -n1 -d'\n', e não o todo xargs.
Olá Mundo
@ HelloWorld - Você pode agrupar argumentos com bastante facilidade, para simular xargs -n$Ntambém com apenas um pouco de script extra.
Charles Stewart
Sim, estou entre os promotores, é apenas uma observação que vale a pena mencionar.
Olá, mundo
Isto é exatamente o que eu faço! Além disso, você pode usar as readopções, como ler mais palavras em variáveis separadas ou alterar o delimitador com IFS=' '.
caesarsol
0
Não com a versão padrão. Eu tenho uma versão hackeada que faz isso - usei antes de saber ' find ... -print0 | xargs -0 ...'. Entre em contato comigo se você quiser uma cópia - veja meu perfil. (Nenhuma ciência de foguetes - no entanto, ele faz o trabalho. Não é uma réplica completa dos xargs.)
Se filecontiver espaços e novas linhas, então o resultado deste comando fará com que seja impossível distinguir entre eles, o que parece estar indo na direção oposta do que esta questão pede
find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4
é demais para digitar em comparação comls *.foo | xargs -P4
.Respostas:
Algo ao longo das linhas de
Deveria trabalhar.
fonte
tr '\n' '\0'
funciona tambémtr
é mais rápido tanto para a CPU quanto para os dedos.O GNU xargs (padrão no Linux; instala
findutils
do MacPorts no OS X para obtê-lo) suporta o-d
que permite especificar um delimitador personalizado para entrada, para que você possafonte
alias xxargs="xargs -d '\n'"
no meu bashrc. Então eu só posso fazer coisas como esta:grep -IRl foo | xxargs sed -i s/foo/bar/g
tr
seja uma boa ideia.brew install findutils
egxargs
era exatamente o que eu precisava no OS X, obrigado.Com o Bash, geralmente prefiro evitar xargs por qualquer coisa menos complicada, a favor de loops while-read. Para sua pergunta,
while read -ar LINE; do ...; done
faz o trabalho (lembre-se de usar a sintaxe da matriz com LINE, por exemplo,${LINE[@]}
para toda a linha). Isso não precisa de nenhum truque: por padrão, a leitura usa apenas\n
o caractere terminador de linha.Eu deveria postar uma pergunta no SO sobre os prós e contras do xargs x loops durante a leitura ... pronto!
fonte
xargs -n1 -d'\n'
, e não o todoxargs
.xargs -n$N
também com apenas um pouco de script extra.read
opções, como ler mais palavras em variáveis separadas ou alterar o delimitador comIFS=' '
.Não com a versão padrão. Eu tenho uma versão hackeada que faz isso - usei antes de saber '
find ... -print0 | xargs -0 ...
'. Entre em contato comigo se você quiser uma cópia - veja meu perfil. (Nenhuma ciência de foguetes - no entanto, ele faz o trabalho. Não é uma réplica completa dos xargs.)fonte
Que
cat file | xargs | sed 's/ /\n/ig'
tal isso converterá espaços em novas linhas, usando ferramentas padrão do bash do Linux.fonte
file
contiver espaços e novas linhas, então o resultado deste comando fará com que seja impossível distinguir entre eles, o que parece estar indo na direção oposta do que esta questão pede