Xargs separados por nova linha

41

É possível xargsusar apenas nova linha como separador? (no bash no Linux e OS X, se isso importa)

Eu sei que -0pode ser usado, mas é PITA, pois nem todos os comandos suportam saída delimitada por NUL.

Kornel
fonte
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.
Pausado até novo aviso.
Esta é uma pergunta SO, não é?
Charles Stewart

Respostas:

17

Algo ao longo das linhas de

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

Deveria trabalhar.

hurfdurf
fonte
38
tr '\n' '\0'funciona também
Kornel
2
perl é um exagero para um único caractere. tré mais rápido tanto para a CPU quanto para os dedos.
Olá Mundo
53

O GNU xargs (padrão no Linux; instala findutilsdo MacPorts no OS X para obtê-lo) suporta o -dque permite especificar um delimitador personalizado para entrada, para que você possa

ls *foo | xargs -d '\n' -P4 foo 
James
fonte
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!

Charles Stewart
fonte
2
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.)

Jonathan Leffler
fonte
0

Que cat file | xargs | sed 's/ /\n/ig'tal isso converterá espaços em novas linhas, usando ferramentas padrão do bash do Linux.

Omar Al-Ithawi
fonte
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
Max Nanasy