En varios lugares de la web he encontrado:
\015
\012
\x0a - hex
\n
\r
todo como sinónimos de varias líneas nuevas / retornos de carro ...
Pero en este pequeño script no puedo reconocer cuando me encuentro con una nueva línea: ¿alguien puede decirme qué debo verificar en la línea if?
#!/bin/bash
test="this is a
test"
for a in "$test"; do
if [[ "$a" == '\012' ]] ; then
echo "FOUND NEWLINE"
fi
echo "$a"
done
cat | while read line; do ...; done
, sabe que hubo un retorno de carro para cada iteración. Si su entrada puede ser archivos\r
sin\n
, simplemente transforme el archivotr '\r' '\n'
mientras procesa la entrada. Si sólo necesita saber si hay varias líneas:wc -l
.wc -l
devolverá 0; deberías agregar eso como respuestaRespuestas:
Si usa cadenas directamente bajo un
for
bucle, funcionará por palabra (aquí en una palabra: todo el contenido de$test
desde que se cita), no por carácter. Debe usar unwhile
bucle conread
para analizar letra por letra o para introducir un parámetro numérico que se repita en la cadena.Además, al usarlo
read
, debe asegurarse de que las líneas nuevas y los espacios en blanco no se interpreten como delimitadores y forzar laread
lectura de un carácter a la vez.Aquí hay una versión funcional:
Puede reemplazar
$'\n'
con$'\012'
o$'\x0a'
, ya que todos representan el mismo código de nueva línea. Pero no es lo mismo que\015
o\r
, esto significa retorno de carro (retorno al comienzo de la línea). En los sistemas Linux, las nuevas líneas se representan usando\n
, pero en Windows, por ejemplo, se representan mediante una secuencia de en su\r\n
lugar. Es por eso que si tuviera un archivo de texto de Windows, también podría detectar nuevas líneas buscando\r
.fuente
\n
en su representación de bytes, por lo que no necesita colocar saltos de línea de aspecto feo en su declaración de prueba.Puede buscar nuevas líneas en una variable muy fácilmente en bash con:
Me resulta más conveniente usar:
fuente
Sugeriría usar
tr
y luegotest
:El
tr -cd
elimina todo excepto Los saltos de linea / retornos de carro. Si hay nuevas líneas en el archivo, habrá una salida desde la cual la-n
prueba devolverá verdadero.fuente
\r
s porque la sustitución de comandos elimina los caracteres de línea nueva ("$(printf '\n\n\n\n\n')"
es la cadena vacía).