[#!/fr] sed ifficile

Page principale
Supprimer ce message
Répondre à ce message
Auteur: koenig.yvan
Date:  
À: La liste francophone des scripts shell
Sujet: [#!/fr] sed ifficile
Bonsoir

J'essaie de bidouiller un script pour éditer les fichiers xml décrivant les documents d' iWork.

Ça marche avec les fichiers "par défaut" dans lesquels tous les descripteurs xml sont à la queue leu leu sans sauts de lignes.

Par contre, lorsque les fichiers sont au format "human readable" c’est à dide découpés en ligne avec des indentations réalisées (par Apple) avec des espaces, je ne trouve pas la solution.

Voilà un script d’essai :

--[SCRIPT]
# prépare les valeurs à insérer dans les blocs de données

set w to 8.5
set h to 11

set wp to ((w as inches as number) * 72.0) as text # EDITED
set hp to ((h as inches as number) * 72.0) as text # EDITED
#===== ADDED from here
if text 2 of (0.5 as text) is "," then
    set {oTIDs, AppleScript's text item delimiters} to {AppleScript's text item delimiters, ","}
    set wp to text items of wp
    set hp to text items of hp
    set AppleScript's text item delimiters to "."
    set wp to wp as text
    set hp to hp as text
    set AppleScript's text item delimiters to oTIDs
end if


# Définition d’un bloc de données

"<sl:print-info><sl:NSJobDisposition><sl:string sfa:string=\"NSPrintSpoolJob\"/></sl:NSJobDisposition><sl:NSPaperSize><sl:value><sfa:size sfa:w=\"595\" sfa:h=\"1234\"/></sl:value></sl:NSPaperSize>"
set source to quoted form of result

# Demande à sed de remp^lacer la valeur 595 par la valeur 612.0

do shell script "sed -E 's/(NSPaperSize><sl:value><sfa:size [^>]*sfa:w=\")[0-9.]+/\\1" & wp & "/' <<<" & source
do shell script "sed -E 's/(NSPaperSize><sl:value><sfa:size [^>]*sfa:h=\")[0-9.]+/\\1" & hp & "/ ;' <<<" & quoted form of result
--> "<sl:print-info><sl:NSJobDisposition><sl:string sfa:string=\"NSPrintSpoolJob\"/></sl:NSJobDisposition><sl:NSPaperSize><sl:value><sfa:size sfa:w=\"612.0\" sfa:h=\"792.0\"/></sl:value></sl:NSPaperSize>"
# BINGO, ça a marché. Il me reste à réunir les deux instructions en une seule.

# Un peu plus compliqué, il y a des espaces entre les tronçons de chaînes

"    <sl:print-info>
      <sl:NSJobDisposition>
        <sl:string sfa:string=\"NSPrintSpoolJob\"/>
      </sl:NSJobDisposition>
      <sl:NSPaperSize>        <sl:value>          <sfa:size sfa:w=\"595\" sfa:h=\"842\"/>
        </sl:value>
      </sl:NSPaperSize>"
set source to quoted form of result


do shell script "sed -E 's/(NSPaperSize>.*<sl:value>.*<sfa:size [^>]*sfa:w=\")[0-9.]+/\\1" & wp & "/' <<<" & source
do shell script "sed -E 's/(NSPaperSize>.*<sl:value>.*<sfa:size [^>]*sfa:h=\")[0-9.]+/\\1" & hp & "/ ;' <<<" & quoted form of result
(* "    <sl:print-info>
      <sl:NSJobDisposition>
        <sl:string sfa:string=\"NSPrintSpoolJob\"/>
      </sl:NSJobDisposition>
      <sl:NSPaperSize>        <sl:value>          <sfa:size sfa:w=\"612.0\" sfa:h=\"842\"/>
        </sl:value>
      </sl:NSPaperSize>"
*)
# BINGO, ça a marché !



# Maintenant ça se corse. Le bloc de données utile est découpé en lignes et il faut donc repérer la chaîne :

"<sl:NSPaperSize>
        <sl:value>
          <sfa:size sfa:w=\"595"


# et là, je ne trouve pas comment faire examiner trois lignes consécutives !
# C'est à dire :
"<sl:NSPaperSize>" & linefeed & "des espaces" & "<sl:value>" & linefeed & "des espaces" & "<sfa:size sfa:w=\"" & "des chiffres"
# définition du bloc de données

"    <sl:print-info>
      <sl:NSJobDisposition>
        <sl:string sfa:string=\"NSPrintSpoolJob\"/>
      </sl:NSJobDisposition>
      <sl:NSPaperSize>
        <sl:value>
          <sfa:size sfa:w=\"595\" sfa:h=\"842\"/>
        </sl:value>
      </sl:NSPaperSize>"
set source to quoted form of result


# J’ai repris les deux instructions ci-dessus mais je ne trouve pas comment les modifier.

do shell script "sed -E 's/(NSPaperSize>.*<sl:value>.*<sfa:size [^>]*sfa:w=\")[0-9.]+/\\1" & wp & "/' <<<" & source
do shell script "sed -E 's/(NSPaperSize>.*<sl:value>.*<sfa:size [^>]*sfa:h=\")[0-9.]+/\\1" & hp & "/ ;' <<<" & quoted form of result

--[/SCRIPT]

Ça m’arrangerait si l'un d'entre vous pouvait m'indiquer l’incantation qui va bien.

Merci d’avance.

Yvan KOENIG (VALLAURIS, France) vendredi 26 octobre 2012 21:14:36



_______________________________________________
archives :
http://listes.patpro.net/list/sshfr.fr.html
http://listes.patpro.net/mailman/listinfo/script_shell_fr