Posez votre question Signaler

Ksh sed et \n

lucifiel - Dernière réponse le 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 ;)
Lire la suite 

Ksh sed et \n »

Suggestions
22 réponses
Réponse
+0
moins plus
Salut,

T'as un exemple de ton fichier à modifier, AVANT => APRÈS s'il te plaît ?
lucifiel - 12 nov. 2009 à 09:07
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
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
Ajouter un commentaire
Réponse
+0
moins plus
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) ?
lucifiel - 12 nov. 2009 à 10:24
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
Ajouter un commentaire
Réponse
+0
moins plus
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$
;-))
jipicy - 12 nov. 2009 à 13:21
Tapes "sed" tout seul ou alors :

strings sed | grep -i ver

lucifiel - 12 nov. 2009 à 13: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
jipicylucifiel - 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

Ajouter un commentaire
Réponse
+0
moins plus
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$
;-))
lucifiel - 12 nov. 2009 à 14:36
oui meme comme ca .....
jipicy - 12 nov. 2009 à 15:39
;-((
Regarde dans le man, peut être y trouveras-tu des pistes...
lucifiel - 12 nov. 2009 à 16:15
ki doc

merci pour ton aide ;)
Ajouter un commentaire
Ce document intitulé « ksh sed et \n » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook