Wc --chars : false result?

Pour quelle raison « wc -m » me retourne un FAUX résultat ?

echo "<p>123</p>" | wc -m
11

Romain

Bonjour,
C’est normal:
3 caractères pour le tag entrant, 4 pour le sortant => 7
3 caractère hors tags.
1 caractère de fin de ligne (retour à la ligne) :wink:

# printf "<p>123</p>" | wc -m
10

Car echo ajoute un retour à la ligne.

# printf "<p>123</p>"
<p>123</p>root@me:~#
root@me:~# echo "<p>123</p>"
<p>123</p>
root@me:~#
1 J'aime

Pas normal.

oUais.

Un deux trois caractères.

Lequel ?

Celui-ci ?

  • \r= 2 caractères

portant non.

Ben si echo ajoute un caractère de fin de ligne.
Facile à prouver d’ailleurs:

echo "<p>123</p>" > texte1.txt
root@mephisto:~# cat -A texte1.txt
<p>123</p>$
root@mephisto:~# printf "<p>123</p>" > texte2.txt
root@mephisto:~# cat -A texte2.txt
<p>123</p>root@mephisto:~#

QED

1 J'aime

OK… Merci @Zargos

Sinon :

echo -n "<p>123</p>" | wc -m
10

Oui car l’option -n indique à echo de ne pas effectuer de saut de ligne final :slight_smile:

1 J'aime

Pour info, wc n’est quand-même pas très élégant pour compter les caractères d’une chaîne, puisqu’inutile !

var='<p>123</p>'

echo ${#var}
10

awk '{print length}' <<<"$var"
10
1 J'aime

Ok Ok @Verner :smiley:

Je l’aime bien celle-ci ; parce que je me demandais « un truc » tout à l’heure. Un truc trop compliqué à expliquer à l’écris – La question était : comment faire une soustraction. Le sujet : total de caractères de <p>123</p> - moins 1 ^^ la galère. Je pensais à faire un « | bc » quelque part – au cas où il y ait des demi-caractère…

:sweat_smile: :rofl:

echo $((${#var}-1))
9

Je n’y arrivais pas :

N’importe quoi :confused:

çà doit être bon comme çà :

var='<p>123</p>' ; echo $((${#var}-1))

J’essaie ; super ! Attendez, je l’export cette variable :smiley:

Donc ni besoin de wc, ni de bc : ça fait du ménage !
Bash (et zsh) savent déjà faire plein de choses par eux-mêmes.
En y rajoutant sed ou awk (installés par défaut), il n’y a besoin de rien d’autre pour traiter des chaînes de caractères, et ça reste la combinaison la plus efficace en temps de traitement.

3 J'aime