¿Cómo eliminar una línea específica de un párrafo en AppleScript, mientras se conserva el formato original del texto?

-1

Tengo una variable de texto de la clase text que muestra algo como esto cuando se devuelve:

"
This is sentence 1.
This is sentence 2.
This is sentence 3.
This is sentence 4."

Quiero poder eliminar líneas específicas del texto, sin afectar el resto de la variable.

Por ejemplo: delete {1, 3} para obtener este resultado:

"This is sentence 1.
This is sentence 3.
This is sentence 4."

El método descrito en esta respuesta tiene un error grave:

< em> "¿Cómo eliminar una línea específica de un párrafo en AppleScript?"

El método vinculado para eliminar líneas en un párrafo en realidad convierte todos los saltos de línea en la variable de texto en retornos. En otras palabras, es imposible ejecutar este código más de una vez en la misma variable.

Por ejemplo, el siguiente código:

set varText to "
This is sentence 1.
This is sentence 2.
This is sentence 3.
This is sentence 4."
set varText to do shell script "sed -e '1d;3d' <<< " & quoted form of varText
-- Employing the same method on the same variable:
set varText to do shell script "sed -e '1d;3d' <<< " & quoted form of varText
return varText

devuelve

""

Dado que este método solo funciona correctamente si las líneas de la variable de texto son el producto de un linefeed (como debería), el problema es not que esto el método no percibe un return como una nueva línea (como dije en esta pregunta). El problema es que este código introduce un return a la variable de texto en primer lugar.

Por lo tanto, quiero una solución que me permita ejecutar la misma variable de texto a través de la solución más de una vez en el mismo AppleScript.

En otras palabras, estoy buscando un método para eliminar una línea específica de un párrafo que no tiene este error y no inserta un return en ninguna parte del texto.

    
pregunta rubik's sphere 16.03.2017 - 05:32

3 respuestas

1

Bueno, he eliminado el original y la primera edición porque has editado tu pregunta original hasta el punto en que es más fácil escribir una nueva respuesta por completo.

Como su pregunta original mostró la siguiente línea de código , como ejemplo de cómo se puede configurar la variable, la incluiré para decir lo siguiente.

Si el varText se ha establecido, por ejemplo:

set varText to (return & "This is sentence 1." & return & "This is sentence 2." & return & "This is sentence 3." & return & "This is sentence 4.")
  • En el que return es x0D en lugar del uso más apropiado de linefeed ( x0A ), en el caso de que la variable sea datos y no un mensaje desechable.

O:

set varText to "
This is sentence 1.
This is sentence 2.
This is sentence 3.
This is sentence 4."
  • En el que cada una de estas líneas realmente termina con un linefeed ( x0A ) como debería estar en una Mac.

El comando do shell script tiene un error , ya que convierte x0A en x0D después de lo que se devuelve de la línea de comando . Las esperadas x0A finales pasadas atrás. Confirmé esto porque si uso lo siguiente:

set varText to "
This is sentence 1.
This is sentence 2.
This is sentence 3.
This is sentence 4."

set varText to do shell script "sed  -e '1d;3d' <<< " & quoted form of varText & " | tee $HOME/Desktop/outfile"

Luego, outfile contiene los finales de linefeed ( x0A ), por lo que se devuelve a do shell script , pero luego convierte erróneamente los finales de línea x0A a los finales de x0D que luego pueden manejarse de la siguiente manera:

Por lo tanto, para acomodar el error , asegúrese siempre de que el contenido de la variable pasada y devuelta contenga los finales de línea x0A usando los siguientes códigos handler y ejemplo .

Lo siguiente asume que varText ya ha sido establecido por cualquiera de los métodos descritos anteriormente.

on ensureLinesEndWith0A(varText)
    set varText to paragraphs of varText
    set oldTID to AppleScript's text item delimiters
    set AppleScript's text item delimiters to linefeed
    set varText to varText as string
    set AppleScript's text item delimiters to oldTID
    return varText
end ensureLinesEndWith0A

set varText to ensureLinesEndWith0A(varText)
set varText to do shell script "sed  -e '1d;3d' <<< " & quoted form of varText
set varText to ensureLinesEndWith0A(varText)

Luego, podría usar lo siguiente nuevamente para eliminar más líneas de varText :

set varText to ensureLinesEndWith0A(varText)
set varText to do shell script "sed  -e '1d;3d' <<< " & quoted form of varText
set varText to ensureLinesEndWith0A(varText)

La imagen de abajo muestra un ejemplo de cómo llamar al comando do shell script " sed ..." dos veces.

    
respondido por el user3439894 16.03.2017 - 15:55
2

Ejemplo :

set varText to "
This is sentence 1.
This is sentence 2.
This is sentence 3.
This is sentence 4."

set varText to do shell script "sed -e '1d;3d' <<< " & quoted form of varText

Returns:

"This is sentence 1.
This is sentence 3.
This is sentence 4."

Actualización: Como resultado de un descubrimiento mencionado en la Edición: de ¿Cómo eliminar una línea específica de un párrafo basado en" retorno "en AppleScript? , deje Yo hago la siguiente declaración:

NOTA: Lamentablemente, lo que se devuelve en este caso tiene retorno de carro (x0D) caracteres en lugar de la esperada nueva línea (x0A) caracteres y en mi opinión es un error!

Es un error porque: el comando do shell script "sed ..." cuando se ejecuta en Terminal con ese varText devuelve con \n (x0A) no \r (x0D ) como se supone que debe Incluso el comando compilado do shell script "sed ..." en el Editor de secuencias de comandos aún tiene \n (x0A), no \r (x0D), sin embargo, ¿por qué se devuelve con \r (x0D) la intención de la esperada% co_de El% (x0A) es un misterio para mí en este momento y lo consideraré un error de AppleScript, ya que no refleja el comportamiento esperado del mismo cuando se ejecuta en Terminal.

Por lo tanto, para tener en cuenta el error en los resultados del comando \n , así es como lo manejaría. Después del comando do shell script "sed ..." use las siguientes líneas de código :

set newLine to "\n"
set varText to paragraphs of varText
set oldTID to AppleScript's text item delimiters
set AppleScript's text item delimiters to newLine
set varText to varText as string
set AppleScript's text item delimiters to oldTID

Ahora, lo que se devuelve contiene nueva línea (x0A) caracteres como debería haber sido para comenzar si no hubiera este error, no retorno de carro (x0D) caracteres .

Nota: cuando se compila, la línea do shell script "sed ..." de código se mostrará a continuación:

set newLine to "
"
    
respondido por el user3439894 14.03.2017 - 12:49
0

Dividamos este script en partes más pequeñas y luego lo juntemos todo en un AppleScript.

Este enfoque está escrito completamente en AppleScript y no requiere herramientas externas. El uso de herramientas externas, como perl o sed , probablemente dará como resultado soluciones mucho más cortas, pero usted ha mencionado en otras preguntas que desean aprender AppleScript.

1. Dividir con delimitadores

Puede usar el comportamiento de delimitadores de AppleScript para dividir una cadena . Puede cambiar el delimitador como desee a return , linefeed , o incluso caracteres como = :

 -- http://macscripter.net/viewtopic.php?id=24473
 to split(someText, delimiter)
     set AppleScript's text item delimiters to delimiter
     set someText to someText's text items
     set AppleScript's text item delimiters to {""} --> restore delimiters to default value
     return someText
 end split

 set myText to (return & "This is sentence 1." & return & "This is sentence 2." & return & "This is sentence 3." & return & "This is sentence 4.")
 set myLines to split(myText, return)

2. Lista de filtros

Con la lista devuelta, puede filtrar los elementos no deseados mediante un bucle:

 -- http://macscripter.net/viewtopic.php?id=24525
 set indexesToDelete to {1, 4}
 set cleanList to {}

 repeat with i from 1 to count myLines
     if i is not in indexesToDelete then set cleanList's end to myLines's item i
 end repeat

3. Combina los elementos

La lista filtrada de oraciones se puede volver a combinar usando otro bucle:

-- Combine the filtered list into a string
set myResult to ""
repeat with i from 1 to count cleanList
    if myResult is "" then
        set myResult to cleanList's item i
    else
        set myResult to myResult & return & cleanList's item i
    end if
end repeat

Enteramente AppleScript

La combinación de estos fragmentos da como resultado el siguiente código:

-- Get the text to work with
set myText to (return & "This is sentence 1." & return & "This is sentence 2." & return & "This is sentence 3." & return & "This is sentence 4.")

-- Split the text into lines based on 'return' delimiter
set myLines to split(myText, return)

-- Filter out indexes 1 and 4 using a loop
set indexesToDelete to {1, 4}
set cleanList to {}
repeat with i from 1 to count myLines
    if i is not in indexesToDelete then set cleanList's end to myLines's item i
end repeat

-- Combine the filtered list into a string
set myResult to ""
repeat with i from 1 to count cleanList
    if myResult is "" then
        set myResult to cleanList's item i
    else
        set myResult to myResult & return & cleanList's item i
    end if
end repeat

-- Final string
myResult

to split(someText, delimiter)
    set AppleScript's text item delimiters to delimiter
    set someText to someText's text items
    set AppleScript's text item delimiters to {""} --> restore delimiters to default value
    return someText
end split

El script anterior podría reducirse combinando el filtro y los bucles de combinación. Las he dejado como tareas separadas para demostrar mejor sus roles.

    
respondido por el Graham Miln 16.03.2017 - 11:00

Lea otras preguntas en las etiquetas