Rechercher : dans
Par :

Ksh sed et \n

Dernière réponse le 12 nov 2009 à 16:15:46 lucifiel, le 12 nov 2009 à 08:56:59 
 Signaler ce message aux modérateurs

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 ;)

Meilleures réponses pour « ksh sed et \n » dans :
Sed - Supprimer une ou plusieurs lignes d'un fichier Voir Supprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
Sed - Introduction à SED - Part II VoirSED - The Stream EDitor - Part II Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Sed - Substitution VoirSubstitution Substitution basique Simple Globale Ciblée Substitution conditionnée Simplee Avancée Bloc Avancéé Substitution basique Simple - 1ère occurrence (de chaque ligne) rencontrée uniquement sed 's/la/LA/' fichier.txt
Sed - Introduction à SED - Part III VoirSED - The Stream EDitor - Part III Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...

1

jipicy, le 12 nov 2009 à 09:01:55

Salut,

T'as un exemple de ton fichier à modifier, AVANT => APRÈS s'il te plaît ?
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

2

lucifiel, le 12 nov 2009 à 09:07:34

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

Répondre à lucifiel

3

lucifiel, le 12 nov 2009 à 09:16:41

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

Répondre à lucifiel

4

jipicy, le 12 nov 2009 à 10:21:25

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) ?
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

5

lucifiel, le 12 nov 2009 à 10:24:03

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

Répondre à lucifiel

6

jipicy, le 12 nov 2009 à 10:52:18

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$
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

7

lucifiel, le 12 nov 2009 à 11:30:36

Ca me met des n au lieu des \n

et je comprends pas le fichier fich.sed xD

Répondre à lucifiel

8

jipicy, le 12 nov 2009 à 11:45:25

Tu bosses sous quel système ? Win ou Unix/Linux ?
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

9

lucifiel, le 12 nov 2009 à 12:26:32

Je bosse sous AIX 5.2

Répondre à lucifiel

10

jipicy, le 12 nov 2009 à 12:33:47

Quelle version de "sed" ? (sed --version)
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

12

lucifiel, le 12 nov 2009 à 13:06:59

Une sur laquelle --version est pas une option -_-

Répondre à lucifiel

13

jipicy, le 12 nov 2009 à 13:21:05

Tapes "sed" tout seul ou alors :

strings sed | grep -i ver

$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

14

lucifiel, le 12 nov 2009 à 13:26:26

Pour
$> sed
syntaxe: sed [-n] Script [fichier ...]
sed [-n] [-e Script] .... [-f fichier_script] ... [fichier ... ]

et pour
$> strings sed | grep -i ver
sed: un fichier ou un répertoire du chemin d acces n existe pas

ca t aide ?
moi pas ...


ps : merci d essayer de m aider

Répondre à lucifiel

11

jipicy, le 12 nov 2009 à 12:54:23

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

$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

15

jipicy, le 12 nov 2009 à 13:27:54

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$
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

16

lucifiel, le 12 nov 2009 à 13:56:13

J obtiens :

sed : 0602-403 /\x0C/\x0A/ n'est pas une fonction reconnue

Répondre à lucifiel

17

jipicy, le 12 nov 2009 à 14:02:56

En changeant le $(...) par `...` peut être :

sed 's/'`echo "\x0C"`'/'`echo "\x0A"`'/' toto
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

18

lucifiel, le 12 nov 2009 à 14:28:26

J ai put l erreur mais ca modifie pas la form feed ....

Répondre à lucifiel

19

jipicy, le 12 nov 2009 à 14:29:36

Même en redirigeant la sortie vers un autre fichier ?
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

20

lucifiel, le 12 nov 2009 à 14:36:58

Oui meme comme ca .....

Répondre à lucifiel

21

jipicy, le 12 nov 2009 à 15:39:47

;-((
Regarde dans le man, peut être y trouveras-tu des pistes...
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

22

 lucifiel, le 12 nov 2009 à 16:15:46

Ki doc

merci pour ton aide ;)

Répondre à lucifiel
Collection CommentÇaMarche.net