Ksh sed et \n

Fermé
lucifiel - 12 nov. 2009 à 08:56
 lucifiel - 12 nov. 2009 à 16:15
Bonjour,


je doit faire modifier un script shell pour du remplacement de texte mais je n arrives pas a placer mon \n dans mon sed et je suis oblige de paser par un tr.

exemple 1

cat $1 | tr "\f" "@" | sed "s,@,#1 #,g" | tr "#" "\n" 


exemple 2

for NUM in $LIGNES
do
	sed "$(( NUM + 11)) s/.*/&#/" $TEMP | sed "$(( NUM + 17)) s/.*/&#/" > $TEMP2
	mv $TEMP2 $TEMP
done
cat $TEMP | tr "#" "\n" > $TEMP2


en suppriant le tr j éliminerai a peur pret 60 operations par fichier de 1 Mo ce qui n est pqs n négligeable ^^

a votre bon coeur monsieur dame ;)

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
Salut,

T'as un exemple de ton fichier à modifier, AVANT => APRÈS s'il te plaît ?
0
AVANT
AVENUE LEON BLUM


                                        XXXXX XXXXX

 XXXXXX                 800000044 26800014800018 DF 2            700256
 XXXXXXX                  800000192
 XXXXXXXXXXXX           POUR OBTENIR UN RENSEIGNE            23/10/2009
 XXXXXXXXXXX                CETTE FACTURATION MERCI D R                7021
     CONSEIL REGIONAL DE XXXXXX  ADRESSER AU XX.XX.XX                     1
                                                                      2009

APRES

1 
 AVENUE LEON BLUM
 
 
                                         XXXXX XXXXX
 
1 

  XXXXXX                 800000044 26800014800018 DF 2            700256
  XXXXXXX                  800000192
  XXXXXXXXXXXX           POUR OBTENIR UN RENSEIGNE            23/10/2009
  XXXXXXXXXXX                CETTE FACTURATION MERCI D R                7021
      CONSEIL REGIONAL DE XXXXXX  ADRESSER AU XX.XX.XX                     1
                                                                       2009
0
lucifiel > lucifiel
12 nov. 2009 à 09:16
Faites pas attention a celui d avant il est totalement faux ^^'

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
0
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
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) ?
0
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
0
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
Quelle version de 'sed' ?

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$
;-))
0
ca me met des n au lieu des \n

et je comprends pas le fichier fich.sed xD
0
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
Tu bosses sous quel système ? Win ou Unix/Linux ?
0
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
je bosse sous AIX 5.2
0
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
Quelle version de "sed" ? (sed --version)
0
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
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

0
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
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$
;-))
0
j obtiens :

sed : 0602-403 /\x0C/\x0A/ n'est pas une fonction reconnue
0
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
En changeant le $(...) par `...` peut être :

sed 's/'`echo "\x0C"`'/'`echo "\x0A"`'/' toto
0
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
j ai put l erreur mais ca modifie pas la form feed ....
0
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
Même en redirigeant la sortie vers un autre fichier ?
0
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
oui meme comme ca .....
0