Disons que j'ai deux variables dans bash:
MULTILINE="I have
more than one line"
SINGLE_LINE="I only have one line
"
Je veux détecter quand une variable contient réellement plus d'une ligne de texte, sans tenir compte des caractères de retour à la ligne supplémentaires.
Donc ça:
if [ some test on "$MULTILINE" ]; then echo 'yes'; else echo 'no'; fi
imprimerait yes
, et ceci:
if [ some test on "$SINGLE_LINE" ]; then echo 'yes'; else echo 'no'; fi
imprimerait no
.
Pour mon cas spécifique, je ne pense pas avoir besoin de m'inquiéter des lignes blanches en tête, mais cela ne ferait pas de mal de savoir comment faire cela.
Comment puis-je faire ceci?
Réponses:
La solution la plus simple que je connaisse est:
par exemple:
==>
Ce qui précède ignore toutes les lignes vides: en tête, en queue et intérieur. Mais notez qu'il n'est pas possible d'avoir une ligne vide intérieure à moins qu'il y ait au moins deux lignes non vides, donc son existence ne peut pas changer la question de savoir s'il y a plus d'une ligne après avoir coupé les lignes vides de début et de fin.
la source
Voir /programming/16414410/delete-empty-lines-using-sed
pour en savoir plus sur la façon de couper / supprimer les espaces et les lignes vides à l'aide de sed.
Maintenant, écrivez votre
if expression ...
utilisation entre$( ... )
guillemets pour obtenir le nombre de lignes et testez le nombre:la source
Une légère modification de ce code devrait le faire. Vous pouvez le mettre dans son propre script pour une réutilisation comme ceci:
Ensuite, vous pouvez l'utiliser comme ça (en supposant que vous avez nommé le script précédent
multiline-check.sh
):la source
fi
. Malheureusement, je suis bloqué sur bash 3.1 (version msysgit). Je ne vois rien qui ressemble à une erreur de syntaxe pour moi, mais évidemment, il me manque quelque chose. Pensées?Ignorer les lignes vides de fin
Voici une approche utilisant
awk
:Comment ça fonctionne:
écho "$ TEST"
Cela prend la variable shell qui nous intéresse et l'envoie à la sortie standard.
tac
Cela inverse l'ordre des lignes afin que la dernière ligne soit renvoyée en premier. Après l'exécution
tac
, les lignes de fin deviennent les lignes de tête.(Le nom
tac
est l'inverse decat
pour la raison quitac
fait ce quecat
fait mais à l'envers.)awk 'f==0 && /./ {f=NR} END{if(f==NR){exit 0}; exit 1 }'
Cela stocke le numéro de ligne de la première ligne non vide dans la variable
f
. Après avoir lu dans toutes les lignes, il se comparef
au nombre total de lignes,NR
. sif
est égal àNR
, alors nous n'avions qu'une seule ligne (en ignorant les blancs initiaux) et nous sortons avec le code 0. S'il y avait une ou plusieurs lignes après la première ligne vide, alors il se termine avec le code `.&& echo "Found A Single Line"
En cas de
awk
sortie avec le code 0, l'echo
instruction est exécutée.Ignorer les lignes vides de début et de fin
En créant une
awk
variable supplémentaire , nous pouvons étendre le test pour ignorer les lignes vides de début et de fin:Parce que cette version du
awk
code gère à la fois les blancs de début et de fin,tac
n'est plus nécessaire.Prendre le
awk
code morceau par morceau:first==0 && /./ {first=NR}
Si la variable
first
est zéro (ou si elle n'a pas encore été définie) et que la ligne a un caractère, n'importe quel caractère, alors définissezfirst
le numéro de ligne. Une fois laawk
lecture des lignes terminée,first
sera défini sur le numéro de ligne de la première ligne non vide././ {last=NR}
Si la ligne contient un caractère, définissez la variable
last
sur le numéro de ligne actuel. Lorsque laawk
lecture de toutes les lignes est terminée, cette variable aura le numéro de ligne de la dernière ligne non vide.END{if(first==last){exit 0}; exit 1 }
Ceci est exécuté après que toutes les lignes ont été lues. Si
first
est égal àlast
, alors nous avons vu zéro ou des lignes non vides et desawk
sorties avec du code0
. Sinon, il se termine avec du code1
. Le script shell peut tester le code de sortie comme d'habitude avec desif
instructions ou&&
ou||
.la source