Remplacer chaîne dans ligne fichier

PIkolloh Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,
J’aimerais faire appel à vos talents pour résoudre une problématique que j’ai actuellement.

Je travaille sur Une machine unix et le script dans lequel je souhaite insérer la commande de modifications est en ksh..

Il y’a différents traitements dans ce script et j’aimerais y ajouter une fonctionnalité.

J’ai un fichier composé de plusieurs lignes de longueur fixe 30 caractères

Chaque ligne commence par une lettre suivi d’un chiffre et 2 espaces, ensuite une succession de chiffre et lettre. Exemple
A1 91190abc76TEST878 67890U
A2 75150cdc87JEUX767 765896

Donc ce que je cherche à faire c’est :
- si la 1er ligne débute par A1 et 2 espaces
Alors si en position 15 j’ai la chaîne TEST
Alors si en position 23 j’ai 3 espace vide
Je remplace cette zone par AIX

J’arrive à récupérer la 1er ligne avec une commande head, les différentes zones de tests avec des cut mais impossible de modifier la ligne avec un sed..
Je pense même que tout doit pouvoir être fait avec un sed mais je n’arrive pas à faire la commande
J’en suis à :
sed -i « .save.modif » -r ‘1(^A1 (.{14})TEST/

Je sèche pour la suite et indique la position de la modif..

Donc si quelques pouvait m’aider sur le sujet ça serait sympa ..

Merci à vous
A voir également:

2 réponses

UnGnU Messages postés 1158 Date d'inscription   Statut Contributeur Dernière intervention   158
 
Salut,
Je remplace cette zone par AIX
Qu'appelles-tu "zone" ? Toute la ligne ? Ou simplement un bout ?

0
PIkolloh Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Salut, la zone de 3 espace vide en position 23 par aix seulement.
Si y’a d’autre zone à espace ailleurvdans la ligne le je n’y touche pas
0
UnGnU Messages postés 1158 Date d'inscription   Statut Contributeur Dernière intervention   158 > PIkolloh Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
$ cat fich
A1 91190abc76TEST878   67890U
A2 75150cdc87JEUX767   765896
A1 91190abc76TOTO878   67890U
A2 75150cdc87JEUX767   765896

$ sed 's/\(A1 .\{10\}TEST[0-9]\{3\}\)\( \{3\}\)\(.*\)/\1AIX\3/' fich
A1 91190abc76TEST878AIX67890U
A2 75150cdc87JEUX767   765896
A1 91190abc76TOTO878   67890U
A2 75150cdc87JEUX767   765896

Si tu ne veux cibler que la 1ère ligne tu rajoutes un "1" devant le "s".
0
PIkolloh Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Ca al 'air de faire parfaitement ce que je souhaite. J'ai juste changé la partie [0-9] car je peux avoir des lettre aussi donc j'ai mis .\{3\}.
Par contre, je reste de la commande, je n'ai comprends pas grand chose..tu pourrais m'expliquer les différents blocs suivants?

Merci de ton aide
0
PIkolloh Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
autre question, quand je rajoute l'option -i pour modifier le fichier courant j'ai l'erreur suivante :
sed: illegal option -- i
Usage: sed [-n] [-u] Script [File ...]
sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...]
0
UnGnU Messages postés 1158 Date d'inscription   Statut Contributeur Dernière intervention   158 > PIkolloh Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Salut,

Concernant les explications, tout est expliqué là : Les sous-expressions et références arrières

Concernant ton problème d'erreur, c'est que tu ne dois pas être sur un système GNU/Linux, mais sur un système Unix (AIX ?) qui ne comprend que très peu d'options (-n, -u et -e) ;-\
Tu n'auras pas d'autres choix que de passer par un fichier temporaire ;-(
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
$ cat fich
A1  91190abc76TEST878   67890U
A2  75150cdc87JEUX767   765896
A1  91190abc76TOTO878   67890U
A2  75150cdc87JEUX767   765896
$ awk 'BEGIN {FIELDWIDTHS="4 10 4 3 3 6"; OFS=""} $1=="A1  " && $3=="TEST" && $5=="   " && NR<2 {$5="AIX"} 1' fich
A1  91190abc76TEST878AIX67890U
A2  75150cdc87JEUX767   765896
A1  91190abc76TOTO878   67890U
A2  75150cdc87JEUX767   765896
0
PIkolloh Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
le résultat parle de lui même mais je n'ai comprends rien non plus à la commande...
Pourrais-tu m’éclairer sur la commande si possible?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
{FIELDWIDTHS="4 10 4 3 3 6" on definit les 4 premiers car. comme le champ 1, les 10 suivants comme le champ 2, les 4 suivants comme le champ 3, etc
OFS="" en sortie, le séparateur de champ est vide
$1=="A1 " && $3=="TEST" && $5==" " && NR<2 on teste les champs selon les conditions émises au post #1
{$5="AIX"} on remplace le champ 5 si les conditions sont remplies
1 on imprime, 1 tout seul == {print $0]}
0