¿Cómo puedo reemplazar espacios con nuevas líneas en una entrada como:
/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5 etc ...
Para obtener lo siguiente:
/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5
Nota
Estoy publicando esta pregunta para ayudar a otros usuarios, no fue fácil encontrar una respuesta útil en UNIX SE hasta que comencé a escribir esta pregunta. Después de eso encontré lo siguiente:
Pregunta relacionada
                    
                        bash
                                text-processing
                                string
                                
                    
                    
                        laconbass
fuente
                
                fuente

Respuestas:
Usa el
trcomandoEncontrado en http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html
fuente
trembargo, esto es EXACTAMENTE para qué sirve!En este caso, usaría printf:
Si hay espacios dentro de una de las rutas, puede citar esa ruta de archivo para evitar que se divida en los espacios:
Para transformar el texto en general,
tres su mejor apuesta, como se cubre en una respuesta existente.fuente
Suponiendo que tiene una cadena con espacios como separadores:
Sin embargo, probablemente estés haciendo la pregunta equivocada. (No necesariamente, por ejemplo, esto podría aparecer en un archivo MAKE). Una lista de nombres de archivos separados por espacios no funciona realmente: ¿qué pasa si uno de los nombres de archivo contiene espacios?
Si un programa recibe nombres de archivo como argumentos, no los una con espacios. Use
"$@"para acceder a ellos uno por uno. Aunqueecho "$@"imprime los argumentos con espacios intermedios, eso se debe aecho: imprime sus argumentos con espacios como separadores.somecommand "$@"pasa los nombres de archivo como argumentos separados al comando. Si desea imprimir los argumentos en líneas separadas, puede usarSi tiene nombres de archivo separados por espacios y desea colocarlos en una matriz para trabajar en ellos, puede usar una expansión de variable sin comillas para dividir el valor en los caracteres
IFS(necesitará deshabilitar la expansión de comodín conset -f, de lo contrario, glob los patrones se expandirán en el valor):Puede encapsular esto en una función que restaura la
-fconfiguración y el valor deIFScuando se hace:fuente
set -fyIFSen el manual de bash si desea todos los detalles. Ver también unix.stackexchange.com/questions/16192/…IFSlocal no surte efectoSe pragmático, usa sed !!
Lo anterior dice que sustituya uno o más caracteres de espacio en blanco (\ s +) con nueva línea (\ n)
Esto es más o menos:
fuente
Como alternativa a
tr@laconbass, también puede usarxargsen este caso:La ventaja es que funciona incluso con espacios en blanco múltiples, lo
trque no funciona.fuente
Así es como lo hice:
Observe el uso de la tecla Intro después de la barra diagonal inversa en el
sedcomando.fuente
sedterminadotr?sedya que es un editor en lugar de simplemente traducir caracteres.sedpuede hacer mucho más, pero es totalmente excesivo para esto.tres la herramienta adecuada para ESTE trabajo, ¡pero el conocimientosedy las expresiones regulares serán útiles más adelante!Otro enfoque, suponiendo que la línea está en una variable llamada
line:Esto hace uso del hecho de que Bash divide sus argumentos en espacios en blanco de forma predeterminada y que
echoagrega una nueva línea a su entrada de forma predeterminada.fuente
es otro método para convertir palabras separadas por un solo espacio en una nueva línea separada.
fuente
El siguiente script es fácil de entender y fácil de usar.
fuente
tr) es la misma que en la respuesta aceptada. Además de que su respuesta tiene los siguientes problemas: a) el comando no está sangrado con 4 espacios (-> diseño de reducción) b) Su uso decates inútil (puede reemplazarlo por< filename tr ' ' '\n'). c) Su nombre de archivo de salida es el mismo que el nombre de archivo de entrada. Con eso creas una carrera de datos.