2 votes

Applescript pour remplacer une chaîne de caractères avec sed

J'ai besoin d'un Applescript pour remplacer un texte comme suit :

Texte original :

 string  string  string  $  text1
 string  string  string  $  text2
 text3
 string  string  string  $  text4

La sortie requise est :

$ text1
$ text2
text3
$ text4

Je peux le faire dans le terminal avec cette commande :

$ echo "string  string  string  $  text1
string  string  string  $  text2
text3
string  string  string  $  text4" | sed -r 's/^(.*)\$ ?(.) (.*)$/$ \3/g'
$ text1
$ text2
text3
$ text4

Au fait, j'utilise bash version 4.3.30 et sed 4.2.2, tous deux issus de homebrew.

Le problème est que je dois le faire à partir d'un applescript. Voici mon approche :

set commandString to "echo \"string  string  string  $  text\" | sed -r 's|^(.*)\\$ ?(.) (.*)$|$ \\3|g'" as string
set formattedCode to do shell script commandString

Et j'obtiens l'erreur suivante :

error "sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]" number 1

Si je retire le -r j'obtiens une erreur différente :

sed: 1: "s|^(.*)\$ ?(.) (.*)$|$  ...": \3 not defined in the RE

Si je retire le \3 la sortie doit être $ au lieu de $ text mais sed la commande ne fait rien et elle sort :

string  string  string  $  text

Je suppose que cela pourrait être un problème avec sed version. Donc, si je remplace sed avec /usr/local/bin/sed il ne fait plus rien après la ligne set formattedCode to do shell script commandString .

Quelqu'un sait où se trouve le problème ?

5voto

Ilari Scheinin Points 1423

Solution 1 : sed

L'option -r de GNU sed est -E sur OS X/BSD sed (celui qui est fourni avec l'OS, /usr/bin/sed ). Et pour éliminer le problème d'encodage des "s", ajoutez export LC_ALL=en_US.UTF-8; export LANG=en_US.UTF-8; au début de la commande do shell script (voir la section question ici ) :

set original_text to "string  string  string  $  text1
string  string  string  $  text2
text3
string  string  string  $  text4"

set commandString to "export LC_ALL=en_US.UTF-8; export LANG=en_US.UTF-8; " & ¬
    "echo " & quoted form of original_text & " | sed -E 's|^(.*)\\$ ?(.) (.*)$|$ \\3|g'" as string
set formattedCode to do shell script commandString

Les retours :

$ text1
$ text2
text3
$ text4

screenshot of solution 1

Solution 2 : Les délimiteurs d'éléments de texte d'AppleScript

set original_text to "string  string  string  $  text1
string  string  string  $  text2
text3
string  string  string  $  text4"

set output to {}
set od to AppleScript's text item delimiters
set AppleScript's text item delimiters to {"
"}
set all_lines to every text item of original_text
repeat with the_line in all_lines
    if "$" is not in the_line then
        set output to output & the_line
    else
        set AppleScript's text item delimiters to {"$"}
        set latter_part to last text item of the_line
        set AppleScript's text item delimiters to {" "}
        set last_word to last text item of latter_part
        set output to output & ("$ " & last_word as string)
    end if
end repeat
set AppleScript's text item delimiters to {"
"}
set output to output as string
set AppleScript's text item delimiters to od
return output

Les retours :

$ text1
$ text2
text3
$ text4

screenshot solution 2

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X