OVH Cloud OVH Cloud

script bash

5 réponses
Avatar
Raphaël SEBAN
bonsoir,

je cherche depuis des heures sur le net des indices qui m'aideraient à
résoudre un problème à priori simple, mais qui devient incroyablement
épineux dans mon script bash.

Comment faire dans bash pour ne retirer que le dernier octet d'un
fichier binaire quelconque (fichier sans cohérence de données, un
fichier non-texte) sans recourir à des critères conditionnels ?

Je sais déjà que :

sed -e '$d' infile

permet de supprimer en entier la dernière ligne d'un fichier, mais je
cherche précisément à ne retirer qu'un et un seul octet placé en toute
fin de fichier.

accessoirement, connaîtriez-vous un NG sur lequel on traite de Bash
scripting en français ?

Merci pour votre aide.

RS.

5 réponses

Avatar
Rakotomandimby Mihamina
On Sun, 29 Oct 2006 22:41:29 +0100, Raphaël SEBAN wrote:

bonsoir,


Bonsoir


Comment faire dans bash pour ne retirer que le dernier octet d'un
fichier binaire quelconque
[...]

sed -e '$d' infile


Est-ce que sed est censé "fonctionner" avec les fichiers binaires?

accessoirement, connaîtriez-vous un NG sur lequel on traite de Bash
scripting en français ?


fr.comp.os.unix, vers lequel j'ai déjà placé le suivi. Il suffit de s'y
abonner

Avatar
lhabert
Raphaël SEBAN :

Comment faire dans bash pour ne retirer que le dernier octet d'un
fichier binaire quelconque (fichier sans cohérence de données, un
fichier non-texte) sans recourir à des critères conditionnels ?


A=`cat fichier`
${A%?}

Sauf que je ne sais pas trop ce que ça donne sur un fichier binaire, ni si
il y a des contraintes de taille.

Solution plus robuste :

TAILLE=`du -b fichier`

COUNT=`expr "$TAILLE" / "$TAILLE_BUFFER"`
REST=`expr "$TAILLE" % "$TAILLE_BUFFER" - 1`

{
dd bs="$TAILLE_BUFFER" count="$COUNT"
dd bs="$REST" count=1
} < fichier > resultat

Avatar
lhabert
Raphaël SEBAN :

Comment faire dans bash pour ne retirer que le dernier octet d'un
fichier binaire quelconque (fichier sans cohérence de données, un
fichier non-texte) sans recourir à des critères conditionnels ?


A=`cat fichier; echo a`
${A%??}

Sauf que je ne sais pas trop ce que ça donne sur un fichier binaire, ni si
il y a des contraintes de taille.

Solution plus robuste :

TAILLE=`du -b fichier`

COUNT=`expr "$TAILLE" / "$TAILLE_BUFFER"`
REST=`expr "$TAILLE" % "$TAILLE_BUFFER" - 1`

{
dd bs="$TAILLE_BUFFER" count="$COUNT"
dd bs="$REST" count=1
} < fichier > resultat

Avatar
JustMe
=?ISO-8859-15?Q?Raphaël_SEBAN?= a écrit
bonsoir,

je cherche depuis des heures sur le net des indices qui m'aideraient à
résoudre un problème à priori simple, mais qui devient incroyablement épineux
dans mon script bash.

Comment faire dans bash pour ne retirer que le dernier octet d'un fichier
binaire quelconque (fichier sans cohérence de données, un fichier non-texte)
sans recourir à des critères conditionnels ?

Je sais déjà que :

sed -e '$d' infile

permet de supprimer en entier la dernière ligne d'un fichier, mais je cherche
précisément à ne retirer qu'un et un seul octet placé en toute fin de
fichier.

accessoirement, connaîtriez-vous un NG sur lequel on traite de Bash scripting
en français ?

Merci pour votre aide.

RS.


sed -e '$s/.$//g'
enlevera le dernier caractere different du retour chariot de la
derniere ligne

Avec sed je doute qu'on puisse aller plus loin car c'est un outil
orienté "lignes de texte"

Pour le dernier octet, tu peux sans doute utiliser :

head -`expr `cat infile | wc -c` - 1`c infile

Avatar
Matthieu Moy
JustMe writes:

Pour le dernier octet, tu peux sans doute utiliser :

head -`expr `cat infile | wc -c` - 1`c infile


head -c -1 foo

devrait faire tout ça.

Pour la robustesse, vérifier quand même ce qu'il se passe quand on a
une locale UTF-8 et un caractère non-ascii à la fin du fichier. Mais
« head --help » parle de « bytes » et non de « chars » donc ça devrait
être bon.

--
Matthieu