Remplacer chaîne dans ligne fichier

Fermé
PIkolloh Messages postés 5 Date d'inscription mercredi 7 mars 2018 Statut Membre Dernière intervention 8 mars 2018 - 7 mars 2018 à 00:08
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 8 mars 2018 à 09:32
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 lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157
7 mars 2018 à 08:03
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 mercredi 7 mars 2018 Statut Membre Dernière intervention 8 mars 2018
7 mars 2018 à 08:14
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 lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157 > PIkolloh Messages postés 5 Date d'inscription mercredi 7 mars 2018 Statut Membre Dernière intervention 8 mars 2018
Modifié le 7 mars 2018 à 11:14
$ 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 mercredi 7 mars 2018 Statut Membre Dernière intervention 8 mars 2018
8 mars 2018 à 00:20
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 mercredi 7 mars 2018 Statut Membre Dernière intervention 8 mars 2018
8 mars 2018 à 00:44
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 lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157 > PIkolloh Messages postés 5 Date d'inscription mercredi 7 mars 2018 Statut Membre Dernière intervention 8 mars 2018
8 mars 2018 à 07:39
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié le 7 mars 2018 à 14:41
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 mercredi 7 mars 2018 Statut Membre Dernière intervention 8 mars 2018
8 mars 2018 à 00:23
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 mars 2018 à 09:32
{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