Xargs separados por nueva línea

41

¿Es posible xargsutilizar solo nueva línea como separador? (en bash en Linux y OS X si eso importa)

Sé que -0se puede usar, pero es PITA ya que no todos los comandos admiten salida delimitada por NUL.

Kornel
fuente
¿Qué es lo que estás tratando de lograr? Puede haber otra forma de hacerlo.
Pausado hasta nuevo aviso.
@Dennis Lo uso para varias cosas, a menudo en tubería con grep, sed, awk muy básico, etc., principalmente para paralelizar la ejecución. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4es demasiado para escribir en comparación con ls *.foo | xargs -P4.
Kornel
Las secuencias de comandos y las funciones son dos formas excelentes de reducir la escritura.
Pausado hasta nuevo aviso.
Esta es una pregunta SO, ¿no?
Charles Stewart el

Respuestas:

17

Algo en la línea de

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

Deberia trabajar.

Hurfdurf
fuente
38
tr '\n' '\0'también funciona
Kornel
2
Perl es excesivo para un solo personaje. trEs más rápido tanto para la CPU como para los dedos.
Hola Mundo,
53

GNU xargs (predeterminado en Linux; instalar findutilsdesde MacPorts en OS X para obtenerlo) admite lo -dque le permite especificar un delimitador personalizado para la entrada, para que pueda hacer

ls *foo | xargs -d '\n' -P4 foo 
James
fuente
Tengo alias xxargs="xargs -d '\n'"en mi bashrc. Así que puedo hacer cosas como esta:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl
44
Esta realmente debería ser la respuesta aceptada. No hay necesidad de salir de Perl. Aunque tres una buena idea también.
Ehtesh Choudhury
3
brew install findutilsy gxargsfue exactamente lo que necesitaba en OS X, gracias.
Brad Koch
5

Con Bash, generalmente prefiero evitar los xargs para cualquier cosa que sea un poco complicada, a favor de los bucles while-read. Para su pregunta, while read -ar LINE; do ...; donehace el trabajo (recuerde usar la sintaxis de matriz con LINE, por ejemplo, ${LINE[@]}para toda la línea). Esto no necesita ningún truco: de forma predeterminada, la lectura se usa \ncomo el carácter del terminador de línea.

Debería publicar una pregunta en SO sobre los pros y los contras de xargs versus bucles while-read ... ¡listo!

Charles Stewart
fuente
2
Esto solo puede emular xargs -n1 -d'\n', y no todo xargs.
Hola Mundo,
@HelloWorld: puede agrupar argumentos con la suficiente facilidad, por lo que también puede simular xargs -n$Ncon solo un poco de secuencias de comandos adicionales.
Charles Stewart,
Sí, estoy entre los votantes, es solo un comentario que vale la pena mencionar.
Hola Mundo,
¡Esto es exactamente lo que hago! Además, puede usar las readopciones, como leer más palabras en variables separadas o cambiar el delimitador con IFS=' '.
caesarsol
0

No con la versión estándar. Tengo una versión pirateada que hace eso, la usé antes de saber ' find ... -print0 | xargs -0 ...'. Contáctame si quieres una copia. Mira mi perfil. (Sin ciencia de cohetes, sin embargo, casi hace el trabajo. No es una réplica completa de xargs).

Jonathan Leffler
fuente
0

¿Qué pasa con cat file | xargs | sed 's/ /\n/ig'esto? Convertir espacios en nuevas líneas, utilizando herramientas estándar de bash de Linux.

Omar Al-Ithawi
fuente
Si filecontiene espacios y líneas nuevas, entonces el resultado de este comando hará que sea imposible distinguirlos, lo que parece ir en la dirección opuesta a lo que esta pregunta pide
Max Nanasy