Dans divers endroits du Web, j'ai trouvé:
\015
\012
\x0a - hex
\n
\r
tous comme synonymes de divers retours à la ligne / retours chariot ...
Mais dans ce petit script, je ne peux pas reconnaître quand je tombe sur une nouvelle ligne - quelqu'un peut-il me dire ce que je devrais vérifier dans la ligne 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
, vous savez qu'il y a eu un retour chariot pour chaque itération. Si votre entrée peut être des fichiers\r
sans\n
, il suffit de transformer le fichiertr '\r' '\n'
lors du traitement de l'entrée. Si vous avez juste besoin de savoir s'il y a plusieurs lignes:wc -l
.wc -l
retournera 0; vous devriez ajouter cela comme une réponseRéponses:
Si vous utilisez directement des chaînes sous une
for
boucle, cela fonctionnera par mot (ici sur un mot: tout le contenu de$test
depuis qu'il est cité), pas par caractère. Vous devez utiliser unewhile
boucle avecread
pour analyser lettre par lettre, ou pour introduire un paramètre numérique qui itérerait sur la chaîne.De plus, lors de l'utilisation
read
, vous devez vous assurer que les sauts de ligne et les espaces ne sont pas interprétés comme des délimiteurs et forcerread
à lire un caractère à la fois.Voici une version de travail:
Vous pouvez remplacer
$'\n'
par$'\012'
ou$'\x0a'
, car ils représentent tous le même code de nouvelle ligne. Mais ce n'est pas la même chose que\015
ou\r
- cela signifie retour chariot (retour au début de la ligne). Sur les systèmes Linux, les sauts de ligne sont représentés à l'aide\n
, mais sur Windows par exemple, ils sont représentés par une séquence de à la\r\n
place. C'est pourquoi si vous aviez un fichier texte de Windows, vous pouvez également détecter les sauts de ligne en recherchant\r
.la source
\n
en sa représentation d'octets, de sorte que vous n'avez pas besoin de placer des sauts de ligne entre guillemets dans votre instruction de test.Vous pouvez vérifier très facilement les sauts de ligne dans une variable en bash avec:
Je le trouve plus pratique à utiliser:
la source
Je suggère d'utiliser
tr
puistest
:Le
tr -cd
supprime tout sauf les retours à la ligne / retours chariot. S'il y a des sauts de ligne dans le fichier, alors il y aura une sortie à partir de laquelle le-n
test retournera vrai.la source
\r
s car la substitution de commande supprime les caractères de fin de ligne ("$(printf '\n\n\n\n\n')"
c'est la chaîne vide).