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.


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.


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 

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!


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.)


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.