Menu

Remplacer chaîne dans ligne fichier

PIkolloh 5 Messages postés mercredi 7 mars 2018Date d'inscription 8 mars 2018 Dernière intervention - 7 mars 2018 à 00:08 - Dernière réponse : dubcek 17429 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 28 mai 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

9 réponses

UnGnU 902 Messages postés lundi 2 mai 2016Date d'inscription 21 juin 2018 Dernière intervention - 7 mars 2018 à 08:03
0
Merci
Salut,
Je remplace cette zone par AIX
Qu'appelles-tu "zone" ? Toute la ligne ? Ou simplement un bout ?

PIkolloh 5 Messages postés mercredi 7 mars 2018Date d'inscription 8 mars 2018 Dernière intervention - 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
UnGnU 902 Messages postés lundi 2 mai 2016Date d'inscription 21 juin 2018 Dernière intervention > PIkolloh 5 Messages postés mercredi 7 mars 2018Date d'inscription 8 mars 2018 Dernière intervention - 7 mars 2018 à 08:22
$ 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".
PIkolloh 5 Messages postés mercredi 7 mars 2018Date d'inscription 8 mars 2018 Dernière intervention - 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
PIkolloh 5 Messages postés mercredi 7 mars 2018Date d'inscription 8 mars 2018 Dernière intervention - 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 ...]
UnGnU 902 Messages postés lundi 2 mai 2016Date d'inscription 21 juin 2018 Dernière intervention > PIkolloh 5 Messages postés mercredi 7 mars 2018Date d'inscription 8 mars 2018 Dernière intervention - 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 ;-(
Commenter la réponse de UnGnU
dubcek 17429 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 28 mai 2018 Dernière intervention - Modifié par dubcek le 7/03/2018 à 14:41
0
Merci
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
PIkolloh 5 Messages postés mercredi 7 mars 2018Date d'inscription 8 mars 2018 Dernière intervention - 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?
dubcek 17429 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 28 mai 2018 Dernière intervention - 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]}
Commenter la réponse de dubcek