¿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
tr
comandoEncontrado en http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html
fuente
tr
embargo, 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,
tr
es 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
-f
configuración y el valor deIFS
cuando se hace:fuente
set -f
yIFS
en el manual de bash si desea todos los detalles. Ver también unix.stackexchange.com/questions/16192/…IFS
local 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 usarxargs
en este caso:La ventaja es que funciona incluso con espacios en blanco múltiples, lo
tr
que no funciona.fuente
Así es como lo hice:
Observe el uso de la tecla Intro después de la barra diagonal inversa en el
sed
comando.fuente
sed
terminadotr
?sed
ya que es un editor en lugar de simplemente traducir caracteres.sed
puede hacer mucho más, pero es totalmente excesivo para esto.tr
es la herramienta adecuada para ESTE trabajo, ¡pero el conocimientosed
y 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
echo
agrega 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 decat
es 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.