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 -
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
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:
- Remplacer chaîne dans ligne fichier
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
2 réponses
Salut,
Je remplace cette zone par AIXQu'appelles-tu "zone" ? Toute la ligne ? Ou simplement un bout ?
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
{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]}
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]}
Si y’a d’autre zone à espace ailleurvdans la ligne le je n’y touche pas
Si tu ne veux cibler que la 1ère ligne tu rajoutes un "1" devant le "s".
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
sed: illegal option -- i
Usage: sed [-n] [-u] Script [File ...]
sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...]
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 ;-(