Rechercher : dans
Par :

[UNIX] Substitution caractère dans un fichier

Dernière réponse le 28 avr 2008 à 17:50:44 looping605, le 12 sep 2006 à 11:22:20 
 Signaler ce message aux modérateurs

Bonjour,
J'aurais voulu savoir si quelqu'un connaissait des commandes unix permettant de substituer un caractére par un autre dans un fichier, dont on spécifit la position dans le fichier concerné ( n° ligne et n° colonne ).
J'ai essayé de la manière suivante :

vi toto.txt << EOT
:3
69l
rS
:x!
EOT
exit 0

Mais le soucis est que cela ne fonctionne que si le fichier est editable sous vi.
Il arrive que pour certains "gros" fichiers j'ai le problème suivant :
"titi.txt" Line too long

Merci d'avance de vos réponses

Meilleures réponses pour « [UNIX] Substitution caractère dans un fichier » dans :
Sed - Conversion retours chariots DOS (CRLF) / UNIX (LF) VoirConversion format de fichier DOS UNIX / UNIX DOS Préambule Ce qu'il faut savoir Conversion DOS vers UNIX Conversion UNIX vers DOS Préambule Il existe déjà des utilitaires (dos2unix et unix2dos) qui s'acquittent très bien ce cette...
Renommer plusieurs fichiers en batch VoirLe fait de renommer un grand nombre de fichiers peut très vite devenir fastidieux. Heureusement, il existe des outils permettant d'automatiser cette tâche dans un grand nombre de cas : Fonctionnalités natives Utilisation d'un programme...
Utiliser des accents et autres caractères spéciaux VoirDans la plupart des langages de programmation, on ne peut utiliser directement les accents et autres caractères non-anglosaxon. La solution est l'unicode, une sorte de code universel. Par exemple pour afficher la chaine de caractères : " là, ça...
UNIX - Les fichiers VoirIntroduction aux fichiers Unix Sous les systèmes UNIX tout élément est représenté sous forme de fichier. L'ensemble des fichiers est architecturé autour d'une unique arborescence dont la base, appelée racine, est notée «/». Types de...
Commandes UNIX VoirTableau des principales commandes UNIX Commande Unix Description Options ls liste le contenu d'un répertoire -a Affiche tous les fichiers, y compris les fichiers cachés ...
Javascript - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractère Une chaîne de caractère est, comme son nom l'indique, une suite de caractères. On la représente par la suite de caractères encadrée par des guillemets simples (') ou doubles ("), sachant que les deux types de...

1

jipicy, le 12 sep 2006 à 14:14:05

Salut,

Tu peux donner un exemple plus précis (fichier en entrée et résultat escompté en sortie), s'il te plaît, merci.


Sinon tu peux déjà voir du côté de la commande "sed" (associée surement à d'autres pour ce que je pense avoir compris de ce que tu veux faire)

;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

looping605, le 12 sep 2006 à 14:48:21

Re-bonjour,

Je vais essayer d'être plus précis.

je veux pouvoir modifier un caractére dans un fichier via un script.
Par exemple j'ai un fichier toto.txt
dans ce fichier, j'ai les enregistrements suivants :
123123123
456456456
789789789
je souhaite substituer le caractére "7" de la 3eme ligne de la 4 éme colonne en un caractére "A" afin d'obtenir :
123123123
456456456
789A89789

Cela fonctionne si j'utilise le script toto.ksh suivant :
Serveur_Test>more toto.ksh

#!/usr/bin/ksh
vi toto.txt << EOT
:2
4l
rA
:x!
EOT
exit 0

Le problème se pose lorsque le fichier toto.txt, qui doit être éditer contient beaucoup trop d'enregistrement pour être edité avec "vi".
Dans ce cas, la proc. ne fonctionne pas.

J'ai essayé avec la commande "sed" mais je n'ai pas trouvé l'option permettant de passer en paramétre un n° de colonne.

Merci

Répondre à looping605

3

lami20j, le 12 sep 2006 à 14:58:28

Salut,

123123123
456456456
789789789
je souhaite substituer le caractére "7" de la 3eme ligne de la 4 éme colonne en un caractére "A" afin d'obtenir :
123123123
456456456
789A89789


je n'ai pas testé, mais essaie quand même

perl -pi.orig -e 's/^(.*){3}./$1A/ if 3..3' toto.txt
lami20j

Répondre à lami20j

5

jipicy, le 12 sep 2006 à 16:19:58

Salut lami20j,

Il y a un hic dans ta syntaxe ;-))

[jp@MDK tmpfs] $ perl -pi.orig -e 's/^(.*){3}./$1A/ if 3..3' toto.txt

[jp@MDK tmpfs] $ cat toto.txt

123123123
456456456
A
123123123
456456456
789789789
Elle a tout mangé ;-)))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

jipicy, le 12 sep 2006 à 16:07:38

Re-

[jp@MDK tmpfs] $ cat toto.txt

123123123
456456456
789789789
123123123
456456456
789789789

[jp@MDK tmpfs] $ sed -i.bak '3s/\(.\{3\}\)\(.\{1\}\)\(.*\)/\1A\3/' toto.txt

[jp@MDK tmpfs] $ cat toto.txt

123123123
456456456
789A89789
123123123
456456456
789789789
;-)) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

9

looping605, le 12 sep 2006 à 16:51:50

Merci beaucoup c'est trop cool.
Je vais voir ce que cela donne sur un dès fichiers que je ne pouvait modifier par ma première procédure.

mais ça va beaucoup m'aider.

Encore merci à tous.

Répondre à looping605

13

looping605, le 12 sep 2006 à 17:36:23

Bon ça marche bien avec des petits fichiers mais avec des fichiers contennat beaucoup d'enregistrements la commande sed ne suit plus.

Mais je garde sous le coude ça peut toujours être utile.

Merci encore de ton aide
@+

Répondre à looping605

6

looping605, le 12 sep 2006 à 16:20:40

Salut,

Merci de ton aide.
J'ai testé la commande perl :
perl -pi.orig -e 's/^(.*){3}./$1A/ if 3..3' toto.txt

le soucis est que la troisième ligne est totalement substitué par le caractère "A" :

Serveur_Test>more toto.txt
123123123
456456456
A

Je pensais à un truc du genre :

cat toto.txt | sed -e "3s/7/A/g" > toto.txt_new1

ais dans ce cas tous les caractères "7" de la 3éme ligne vont être substitués par des caractères "A" comme suit :

Serveur_Test>more toto.txt_new1
123123123
456456456
A89A89A89

Et c'est là que je bloque, je ne vois pas comment donner en entrée de ma commande sed la position spécifique de caractère "7" à modifier sans que les autres "7" de cette ligne ne soient modifiés.

@+

Répondre à looping605

7

lami20j, le 12 sep 2006 à 16:39:28

Re,


le soucis est que la troisième ligne est totalement substitué par le caractère "A" :


Oui, je n'ai pas fait attention. C'est de ma faute.
.* avale la chaine entière ;)

Essaie

perl -pi.orig -e 's/^(.{3})./$1A/ if 3..3' toto.txt 
lami20j

Répondre à lami20j

12

looping605, le 12 sep 2006 à 17:32:29

ça c'est trop bon je prends.
je te remercit ça fonctionne du tonnerre.
Même les fichiers qui me posaient problème sont modifiés tranquillement.

Encore merci de votre aide.

@+

Répondre à looping605

8

jipicy, le 12 sep 2006 à 16:49:10

Ok c'est nickel comme ça ;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

10

lami20j, le 12 sep 2006 à 16:50:57

Salut,

te parles de ma ligne?!

je suis au boulot et je ne peux pas tester.

lami20j

Répondre à lami20j

11

jipicy, le 12 sep 2006 à 17:08:11

Oui, de ta ligne en aveugle ;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

15

 Maryline, le 28 avr 2008 à 17:50:44

Effectivement, la commande perl fonctionne tres bien.
Mais comment fait-on si on a un enchainement de n caractère à remplacer.
Dans l'exemple ci dessus, remplacer 789 par AAA ?

Merci de votre aide.

Répondre à Maryline