A voir également:
- Ksh sed et \n
- Remplacez le mot sed par le mot mais dans tout le texte. combien de caractères contient le document suite à cette modification (en incluant les espaces) ? - Guide
- Sed - Remplacement texte par retour à la ligne ? ✓ - Forum Linux / Unix
- Sed et ses caprices (ou les miens) ✓ - Forum Linux / Unix
- Ksh elif ✓ - Forum Programmation
- Sed windows - Forum Linux / Unix
4 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
12 nov. 2009 à 09:01
12 nov. 2009 à 09:01
Salut,
T'as un exemple de ton fichier à modifier, AVANT => APRÈS s'il te plaît ?
T'as un exemple de ton fichier à modifier, AVANT => APRÈS s'il te plaît ?
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
12 nov. 2009 à 10:21
12 nov. 2009 à 10:21
Re-
Tous tes fichiers sont structurés de la même façon ?
C'est des lignes vides qu'il y a en début (3) ?
Tous tes fichiers sont structurés de la même façon ?
C'est des lignes vides qu'il y a en début (3) ?
tous structurer de la meme facon, la premiere ligne est une ligne vide.
script complet :
#!/bin/bash
#
# Script bash de traitement du fichier IM232.txt
# Utilisation : script fichier-source fichier-destination
# Le fichier source existe-il ?
if [ ! -s "$1" ]; then
echo "Le fichier passe en parametre n'existe pas !"
echo "Utilisation : $0 fichier"
exit
fi
# Fichiers temporaires (deux a cause du fonctionnement obsolete de Sed)
TEMP="$$.temp"
TEMP2="$$.temp2"
# Alors on degage le ":" de la date, sinon le fichier ne peut pas etre enregister sous Windows
DATE=$(date +%F_%T | tr ":" "-")
# Nom du fichier final
#FINAL="titre2_$DATE.dta"
FINAL="titre2_$$.dta"
#######################
# DEBUT du traitement #
#######################
# Suppression des phrases inutiles, et décallage d'un espace vers la droite "sed, c'est bien" (long, mais bien)
cat $1 | tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ\f" "aceeeeiioouuACEEEEIIOOUU@" | sed -e "s/^/ /;s/FACTURE SE REPORTER/ /g;s/80054 AMIENS PORTER RECLAMATION CONCER [HES]/ /g;s/1 PLA VICTOR PAUCHET POUR OBTENIR UN RENSEIGNE/ /g;s/RESPONSABILITE TAUX A VOTRE CHARGE//g;s/80054 AMIENS CETTE FACTURATION MERCI D R/ /g;s/TARIF DE//g;s/TVA TVA MONTANT HT//g;s/MONTANT//g;s/ADRESSER AU 03.22.66/ /g;s/DE 8H A 16H AU 03.22/ /g;s/1 PLA VICTOR PAUCHET POUR TOUT RENSEIGNEMENT C/ /g;s/80054 AMIENS CETTE FACTURE MERCI DE VO H/ /g" | sed "s,@,#1 #,g" > $TEMP
# On repere les lignes ou on veut inserer une nouvelle ligne, soit :
# 1) la 11eme ligne en dessous du code postal (C H U Amiens)
# 2) la 17eme ligne en dessous du code postal
LIGNES=$(cat $TEMP | grep -n "C H U AMIENS"| cut -d : -f1)
for NUM in $LIGNES
do
sed "$(( NUM + 11)) s/.*//" $TEMP | sed "$(( NUM + 17)) s/.*//" > $TEMP2
mv $TEMP2 $TEMP
done
# Gestion des "1 " a mettre a la fin des pages, attention faut suivre :
# Comme la version de sed sur srvgam est un peu obsolete, on est oblige de bricoler pour reussir ce qu'on veut faire (en gros sed voit pas le caractere)
# on a deja remplacer le FF par un @, on va remplacer ce @ par la sequence #1 #, on remplace les # par des \n
#sed "s/@/#1 #/g" $TEMP |
cat $TEMP | tr "#" "\n" > $TEMP2
# on oublie pas d'ajouter le "1 " en debut de fichier
echo "1 " > $TEMP
# Creation du fichier final
cat $TEMP $TEMP2 > $FINAL
# On degage les fichiers temporaires
rm -f $TEMP $TEMP2
#####################
# FIN du traitement #
#####################
echo "Traitement fini"
exit
script complet :
#!/bin/bash
#
# Script bash de traitement du fichier IM232.txt
# Utilisation : script fichier-source fichier-destination
# Le fichier source existe-il ?
if [ ! -s "$1" ]; then
echo "Le fichier passe en parametre n'existe pas !"
echo "Utilisation : $0 fichier"
exit
fi
# Fichiers temporaires (deux a cause du fonctionnement obsolete de Sed)
TEMP="$$.temp"
TEMP2="$$.temp2"
# Alors on degage le ":" de la date, sinon le fichier ne peut pas etre enregister sous Windows
DATE=$(date +%F_%T | tr ":" "-")
# Nom du fichier final
#FINAL="titre2_$DATE.dta"
FINAL="titre2_$$.dta"
#######################
# DEBUT du traitement #
#######################
# Suppression des phrases inutiles, et décallage d'un espace vers la droite "sed, c'est bien" (long, mais bien)
cat $1 | tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ\f" "aceeeeiioouuACEEEEIIOOUU@" | sed -e "s/^/ /;s/FACTURE SE REPORTER/ /g;s/80054 AMIENS PORTER RECLAMATION CONCER [HES]/ /g;s/1 PLA VICTOR PAUCHET POUR OBTENIR UN RENSEIGNE/ /g;s/RESPONSABILITE TAUX A VOTRE CHARGE//g;s/80054 AMIENS CETTE FACTURATION MERCI D R/ /g;s/TARIF DE//g;s/TVA TVA MONTANT HT//g;s/MONTANT//g;s/ADRESSER AU 03.22.66/ /g;s/DE 8H A 16H AU 03.22/ /g;s/1 PLA VICTOR PAUCHET POUR TOUT RENSEIGNEMENT C/ /g;s/80054 AMIENS CETTE FACTURE MERCI DE VO H/ /g" | sed "s,@,#1 #,g" > $TEMP
# On repere les lignes ou on veut inserer une nouvelle ligne, soit :
# 1) la 11eme ligne en dessous du code postal (C H U Amiens)
# 2) la 17eme ligne en dessous du code postal
LIGNES=$(cat $TEMP | grep -n "C H U AMIENS"| cut -d : -f1)
for NUM in $LIGNES
do
sed "$(( NUM + 11)) s/.*//" $TEMP | sed "$(( NUM + 17)) s/.*//" > $TEMP2
mv $TEMP2 $TEMP
done
# Gestion des "1 " a mettre a la fin des pages, attention faut suivre :
# Comme la version de sed sur srvgam est un peu obsolete, on est oblige de bricoler pour reussir ce qu'on veut faire (en gros sed voit pas le caractere)
# on a deja remplacer le FF par un @, on va remplacer ce @ par la sequence #1 #, on remplace les # par des \n
#sed "s/@/#1 #/g" $TEMP |
cat $TEMP | tr "#" "\n" > $TEMP2
# on oublie pas d'ajouter le "1 " en debut de fichier
echo "1 " > $TEMP
# Creation du fichier final
cat $TEMP $TEMP2 > $FINAL
# On degage les fichiers temporaires
rm -f $TEMP $TEMP2
#####################
# FIN du traitement #
#####################
echo "Traitement fini"
exit
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
12 nov. 2009 à 10:52
12 nov. 2009 à 10:52
Quelle version de 'sed' ?
Un truc comme ça, ça ne t'irait pas ?
Un truc comme ça, ça ne t'irait pas ?
jp@MDK:~/tmpfs ssh$ cat plop C H U AMIENS 800000044 26800014800018 77 1 603702 LONGS SEJOURS ST VICTOR 800006264 1 PLA VICTOR PAUCHET POUR TOUT RENSEIGNEMENT C 23/10/2009 80054 AMIENS CETTE FACTURE MERCI DE VO H 6054 MR X DE 8H A 16H AU 03.22 1 X 2009 YOLANDE 18/04/1926 TRESORERIE CENTRE ST VICTOR 8 RUE EMILE LESOT 80054 AMIENS 80039 AMIENS 859968605/016 001590726 FICHAUX YOLANDE 10 UDAF FICHAUX YOLANDE 21-23 RUE FREDERIC PETIT 226046748245607 018012146 80048 AMIENS CEDEX 1 jp@MDK:~/tmpfs ssh$ cat fich.sed n n n s/.* // n s/.* // n s/\([^ ]*.[^ ] *\).* \(.*\)/\1\2/ :z n /^$/ !b z :y n /^$/ b y n s/.*/\n&/ :w n $ !b w jp@MDK:~/tmpfs ssh$ sed -f fich.sed plop C H U AMIENS 800000044 26800014800018 77 1 603702 LONGS SEJOURS ST VICTOR 800006264 23/10/2009 6054 MR X 1 X 2009 YOLANDE 18/04/1926 TRESORERIE CENTRE ST VICTOR 8 RUE EMILE LESOT 80054 AMIENS 80039 AMIENS 859968605/016 001590726 FICHAUX YOLANDE 10 UDAF FICHAUX YOLANDE 21-23 RUE FREDERIC PETIT 226046748245607 018012146 80048 AMIENS CEDEX 1 jp@MDK:~/tmpfs ssh$;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
lucifiel
12 nov. 2009 à 11:45
12 nov. 2009 à 11:45
Tu bosses sous quel système ? Win ou Unix/Linux ?
lucifiel
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
12 nov. 2009 à 12:26
12 nov. 2009 à 12:26
je bosse sous AIX 5.2
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
lucifiel
12 nov. 2009 à 12:33
12 nov. 2009 à 12:33
Quelle version de "sed" ? (sed --version)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
lucifiel
12 nov. 2009 à 12:54
12 nov. 2009 à 12:54
n
n
n
Commande next. On passe à la ligne suivante (3 fois)
s/.* //
On substitue tout ce qui se trouve entre le début de la ligne et le dernier espace (on joue ici sur la gourmandise des regex)
n
On passe à la ligne suivante
s/.* //
Idem.
n
On passe à la ligne suivante
s/\([^ ]*.[^ ] *\).* \(.*\)/\1\2/
Grâce aux sous-expressions (voir la FAQ), on récupère les 2 morceaux de la ligne qui nous intéressent.
:z
Étiquette
n
On passe à la ligne suivante
/^$/ !b z
Si la ligne n'est pas vide, on boucle sur l'étiquette
:y
Étiquette
n
On passe à la ligne suivante
/^$/ b y
Si la ligne est vide, on boucle sur l'étiquette
n
On passe à la ligne suivante
s/.*/\n&/
On substitue toute la ligne par un saut de ligne suivi de la ligne elle même
:w
Étiquette
n
On passe à la ligne suivante
$ !b w
Tant qu'on n'a pas atteint la dernière ligne, on boucle
n
n
Commande next. On passe à la ligne suivante (3 fois)
s/.* //
On substitue tout ce qui se trouve entre le début de la ligne et le dernier espace (on joue ici sur la gourmandise des regex)
n
On passe à la ligne suivante
s/.* //
Idem.
n
On passe à la ligne suivante
s/\([^ ]*.[^ ] *\).* \(.*\)/\1\2/
Grâce aux sous-expressions (voir la FAQ), on récupère les 2 morceaux de la ligne qui nous intéressent.
:z
Étiquette
n
On passe à la ligne suivante
/^$/ !b z
Si la ligne n'est pas vide, on boucle sur l'étiquette
:y
Étiquette
n
On passe à la ligne suivante
/^$/ b y
Si la ligne est vide, on boucle sur l'étiquette
n
On passe à la ligne suivante
s/.*/\n&/
On substitue toute la ligne par un saut de ligne suivi de la ligne elle même
:w
Étiquette
n
On passe à la ligne suivante
$ !b w
Tant qu'on n'a pas atteint la dernière ligne, on boucle
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
12 nov. 2009 à 13:27
12 nov. 2009 à 13:27
Sinon pour tes "Form Feed", essaie ça :
jp@MDK:~/tmpfs ssh$ cat -A toto Bonjour ^L$ jp@MDK:~/tmpfs ssh$ sed 's/'$(echo "\x0C")'/'$(echo "\x0A")'/' toto Bonjour jp@MDK:~/tmpfs ssh$ sed 's/'$(echo "\x0C")'/'$(echo "\x0A")'/' toto | cat -A Bonjour $ $ jp@MDK:~/tmpfs ssh$;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
lucifiel
12 nov. 2009 à 14:02
12 nov. 2009 à 14:02
En changeant le $(...) par `...` peut être :
sed 's/'`echo "\x0C"`'/'`echo "\x0A"`'/' toto
lucifiel
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
12 nov. 2009 à 14:28
12 nov. 2009 à 14:28
j ai put l erreur mais ca modifie pas la form feed ....
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
lucifiel
12 nov. 2009 à 14:29
12 nov. 2009 à 14:29
Même en redirigeant la sortie vers un autre fichier ?
lucifiel
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
12 nov. 2009 à 14:36
12 nov. 2009 à 14:36
oui meme comme ca .....
12 nov. 2009 à 09:07
APRES
12 nov. 2009 à 09:16
Avant =
C H U AMIENS 800000044 26800014800018 77 1 603702
LONGS SEJOURS ST VICTOR 800006264
1 PLA VICTOR PAUCHET POUR TOUT RENSEIGNEMENT C 23/10/2009
80054 AMIENS CETTE FACTURE MERCI DE VO H 6054
MR X DE 8H A 16H AU 03.22 1
X 2009
YOLANDE
18/04/1926 TRESORERIE
CENTRE ST VICTOR 8 RUE EMILE LESOT
80054 AMIENS 80039 AMIENS
859968605/016 001590726 FICHAUX YOLANDE
10 UDAF
FICHAUX YOLANDE 21-23 RUE FREDERIC PETIT
226046748245607
018012146 80048 AMIENS CEDEX 1
Apres =
1
C H U AMIENS 800000044 26800014800018 77 1 603702
LONGS SEJOURS ST VICTOR 800006264
23/10/2009
6054
MR X 1
X 2009
YOLANDE
18/04/1926 TRESORERIE
CENTRE ST VICTOR 8 RUE EMILE LESOT
80054 AMIENS 80039 AMIENS
859968605/016 001590726 FICHAUX YOLANDE
10 UDAF
FICHAUX YOLANDE 21-23 RUE FREDERIC PETIT
226046748245607
018012146 80048 AMIENS CEDEX 1