Forzar nuevas líneas con la printing de comodín de gato

Quiero usar cat con comodines en bash para imprimir múltiples files pequeños (cada file es una oración) a la salida estándar. Sin embargo, los contenidos de files separados no están separados por una nueva línea, que me gustaría leer con facilidad.

¿Cómo puedo agregar un delimitador de file de algún tipo a este command?

Defina una function de shell que genera un final de línea después de cada file y úsela en lugar de cat :

 endlcat() { for file in "$@"; do cat -- "$file" echo done } 

entonces puedes usar endlcat * .

El bucle for loops sobre todos los arguments proporcionados ( $@ ) que ya han sido escapados por el shell cuando se usan comodines como * . El -- se requiere para no ahogarse en los nombres de file que comienzan con un guión. Finalmente, el echo produce una nueva línea.

Solo usa un loop en lugar de simple cat :

 for file in /path/to/targetdir/*; do echo "-------- $file -------" cat "$file" done 

Si desea un nombre de file entre files, use tail :

 tail -n +1 ./* 

(En caso de que desee tac lugar de cat , alguna implementación de tail tiene -r opción para tac equivalente funcional)

Similar a la respuesta de @terdon , si prefieres ver el nombre del file en el futuro también, puedes usar el command head :

 $ head *file* ==> file_1 <== file 1 content ==> file_2 <== file 2 content ==> file_3 <== file 3 content 

head pnetworkingeterminada en las primeras 10 líneas, por lo que usarla sin opciones de command para su caso (una oración por file) está perfectamente bien. De lo contrario, necesita la opción -n X

Esto funcionará:

 sed '' -- * 

No necesita ningún bucle de shell o de lo contrario, y esto siempre seguirá el resultado de un file con \n ewline, exceptuando quizás el último.

De lo contrario, si desea que se emita una línea en blanco entre la salida de cada file, esto podría funcionar:

 bpaste(){ eval "paste -'sd\n' -- $(x=0;for f do printf "\"\${$((x+=1))}\" - ";done)" } </dev/null 

Eso siempre seguirá el resultado de un file con \n ewline y una línea en blanco adicional.

Puedes llamarlo así:

 bpaste * 

Otra forma: use grep -h para simplemente search la cadena vacía en cada file. Esto coincidirá con todas las líneas, independientemente de cuántos, si termina con nueva línea o no. Los resultados de grep siempre terminan en nueva línea. La opción -h suprime el prefijo de cada línea de salida con el nombre de file del que proviene:

 $ printf 'a' > a $ printf 'b\nB' > b $ printf 'c\n' > c $ ls abc $ cat -- * ab Bc $ grep -h '' * a b B c $ 

O puede usar la paste GNU en el modo automático con nueva línea como delimitador:

 $ paste -s -d '\n' -- * a b B c $