Applescript para reemplazar cadena usando sed

Necesito y Applescript para reemplazar un texto de la siguiente manera:

Texto original:

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

La salida requerida es:

$ text1
$ text2
text3
$ text4

Puedo hacerlo en la terminal con este comando:

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

Por cierto, estoy usando bash versión 4.3.30 y sed 4.2.2, ambos de homebrew.

El problema aquí es que necesito hacerlo desde un applescript. Este es mi enfoque:

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

Y me sale el siguiente error:

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 elimino la -ropción, obtengo un error diferente:

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

Si elimino el \3, la salida debe ser $en lugar de $ text, pero sedel comando no hace nada y genera:

string  string  string  $  text

Supuse que esto podría ser un problema con sedla versión. Entonces, si lo reemplazo sedcon /usr/local/bin/sedél, no vuelve a hacer nada después de la línea set formattedCode to do shell script commandString.

Alguien sabe donde esta el problema?

El comando en el applescript no reconoce el . También usa la opción -E para RegEx extendido. Si realmente elimina el último, obtiene el resultado. Pero sospecho que los tienes allí por una razón.

Respuestas (1)

Solución 1: sed

La opción -r de GNU sed es -E en OS X/BSD sed (la que viene con el sistema operativo /usr/bin/sed). Y para deshacerse del problema de codificación con , agregue export LC_ALL=en_US.UTF-8; export LANG=en_US.UTF-8;al principio del comando do shell script (vea la pregunta aquí ):

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

Devoluciones:

$ text1
$ text2
text3
$ text4

captura de pantalla de la solución 1

Solución 2: delimitadores de elementos de texto de 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

Devoluciones:

$ text1
$ text2
text3
$ text4

solución de captura de pantalla 2

¿No es tan simple? Como entrada, recibo varias líneas, unas pueden estar precedidas por el ejemplo ("cadena  cadena  cadena  $  texto") pero otras no. Por eso necesito que funcione el comando sed. Si cambio la opción sed para que -Efuncione en la terminal, pero no en el applescript.
@jherran, actualicé mi respuesta con lo que parece ser una solución sed funcional al menos de mi parte. Si eso también funciona para usted, puedo limpiar la respuesta eliminando los intentos de AppleScript.
Muy cerca de @Ilari Scheinin, pero desafortunadamente solo funciona para la última línea. Revisa mi pregunta, la actualicé un poco.
@jherran, no estoy seguro de lo que no funciona: obtengo exactamente el mismo resultado al ejecutar el comando desde el shell que al ejecutarlo desde AppleScript (lo que ha enumerado en "Salida requerida", excepto que hay un espacio adicional antes del texto3). Entonces, no sé si es la expresión regular la que necesita ajustarse, o algo sobre la conexión entre AppleScript y el shell. (Estoy en Yosemite 10.10.1 en caso de que eso pueda marcar la diferencia).
Para mí en la terminal funciona como se describe. Desde el applescript solo muestra la última línea. Y sí, estoy en Yosemite.
Extraño. @jherran, actualicé mi respuesta limpiándola y ahora ambos enfoques (sed y delimitadores de elementos de texto de AppleScript) funcionan para mí. ¿Puedes comprobar de nuevo?