Digamos que tengo dos variables en bash:
MULTILINE="I have
more than one line"
SINGLE_LINE="I only have one line
"
Quiero detectar cuándo una variable realmente contiene más de una línea de texto, sin tener en cuenta los caracteres adicionales de línea nueva.
Así que esto:
if [ some test on "$MULTILINE" ]; then echo 'yes'; else echo 'no'; fi
imprimiría yes
, y esto:
if [ some test on "$SINGLE_LINE" ]; then echo 'yes'; else echo 'no'; fi
imprimiría no
.
Para mi caso específico, no creo que deba preocuparme por las líneas en blanco, pero no estaría de más saber cómo hacerlo.
¿Cómo puedo hacer esto?
Respuestas:
La solución más simple que conozco es:
p.ej:
==>
Lo anterior ignora todas las líneas en blanco: iniciales, finales e interiores. Pero tenga en cuenta que no es posible tener una línea en blanco interior a menos que haya al menos dos líneas no en blanco, por lo que su existencia no puede alterar la cuestión de si hay más de una línea después de recortar las líneas en blanco iniciales y finales.
fuente
Consulte /programming/16414410/delete-empty-lines-using-sed
para obtener más información sobre cómo recortar / eliminar espacios en blanco y líneas vacías con sed.
Ahora para escribir su
if expression ...
uso$( ... )
entre comillas para obtener el número de líneas, y probar contra el número:fuente
Una ligera modificación a este código debería hacerlo. Puede ponerlo en su propio script para reutilizarlo así:
Luego puede usarlo así (suponiendo que haya nombrado el script anterior
multiline-check.sh
):fuente
fi
. Desafortunadamente, estoy atascado en bash 3.1 (versión msysgit). No veo nada que me parezca un error de sintaxis, pero obviamente me falta algo. Pensamientos?Ignorando las líneas en blanco al final
Aquí hay un enfoque usando
awk
:Cómo funciona:
echo "$ PRUEBA"
Esto toma cualquier variable de shell que nos interese y la envía al estándar.
tac
Esto invierte el orden de las líneas para que la última línea se devuelva primero. Después de ejecutar
tac
, las líneas finales se convierten en las líneas principales.(El nombre
tac
es el reverso decat
por la razón quetac
hace lo quecat
hace pero a la inversa).awk 'f==0 && /./ {f=NR} END{if(f==NR){exit 0}; exit 1 }'
Esto almacena el número de línea de la primera línea no en blanco en la variable
f
. Después de leer en todas las líneas, se comparaf
con el número total de líneas,NR
. sif
es igual aNR
, entonces teníamos una sola línea (ignorando los espacios en blanco iniciales) y salimos con el código 0. Si había una o más líneas después de la primera línea en blanco, entonces sale con el código '.&& echo "Found A Single Line"
Si
awk
salió con el código 0,echo
se ejecuta la instrucción.Ignorando las líneas en blanco iniciales y finales
Al crear una
awk
variable adicional , podemos extender la prueba para ignorar las líneas en blanco iniciales y finales:Debido a que esta versión del
awk
código maneja los espacios en blanco iniciales y finales,tac
ya no es necesaria.Tomando el
awk
código pieza por pieza:first==0 && /./ {first=NR}
Si la variable
first
es cero (o aún no se ha establecido) y la línea tiene un carácter, cualquier carácter, se establecefirst
en el número de línea. Cuandoawk
termine de leer las líneas,first
se establecerá el número de línea de la primera línea que no esté en blanco././ {last=NR}
Si la línea tiene algún carácter, establezca la variable
last
en el número de línea actual. Cuandoawk
termine de leer todas las líneas, esta variable tendrá el número de línea de la última línea no en blanco.END{if(first==last){exit 0}; exit 1 }
Esto se ejecuta después de haber leído todas las líneas. Si
first
es igual alast
, entonces hemos visto cero o líneas no en blanco yawk
salidas con código0
. De lo contrario, sale con código1
. El script de shell puede probar el código de salida como de costumbre conif
sentencias o&&
o||
.fuente