0 votos

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

Tengo una variable de texto de clase text que muestra algo así cuando se devuelve:

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

Quiero poder borrar líneas específicas del texto, sin afectar al 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 grave error:

"¿Cómo borrar una línea específica de un párrafo en AppleScript?"

El método vinculado para borrar 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

""

Como este método sólo funciona correctamente si las líneas de la variable de texto son el producto de un linefeed (como debería), el problema es no que este método no percibe una return como una nueva línea (como había afirmado originalmente 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 pasar la misma variable de texto por 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 tenga este error y no inserte un return en cualquier parte del texto.

1voto

user3439894 Puntos 5883

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

Devuelve:

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

Actualización: Como resultado de un descubrimiento mencionado en el Editar: de ¿Cómo borrar una línea específica de un párrafo basado en "return" en AppleScript? Permítanme hacer la siguiente declaración:

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

Es un error porque: El do shell script "sed ..." comando cuando se ejecuta en el Terminal con ese varText vuelve con \n (x0A) no \r (x0D) como se supone. Incluso el compilado do shell script "sed ..." comando en el editor de script todavía tiene \n (x0A) no \r (x0D) sin embargo por qué se devuelve con \r (x0D) intención del esperado \n (x0A) es un misterio para mí en este momento y voy a considerar que se trata de 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 la error en los resultados del do shell script "sed ..." comando Así es como yo lo manejaría. Después de la do shell script "sed ..." comando utilice 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 si no existiera este error, no retorno de carro (x0D) caracteres .


Nota: Cuando se compila, el set newLine to "\n" línea de código se mostrará como se indica a continuación:

set newLine to "
"

1voto

user3439894 Puntos 5883

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

Dado que su pregunta original mostraba la siguiente línea de código Como ejemplo de cómo se puede establecer la variable, voy a incluirla para decir lo siguiente.

Si el varText se ha fijado, por ejemplo, en

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 frente al uso más adecuado de linefeed ( x0A ) en su lugar, en un caso en el que la variable es 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 termina realmente con un linefeed ( x0A ) como debería ser en un Mac.

El do shell script comando tiene un error ya que convierte x0A a x0D después de lo que se devuelve del línea de comandos teniendo la esperada x0A finales pasados de nuevo. He confirmado 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"

Entonces outfile contiene linefeed ( x0A ) para que lo mismo se devuelva a do shell script pero luego convierte erróneamente el x0A finales de línea a x0D finales que pueden ser manejados por lo siguiente:

Así que, para dar cabida a la error , asegúrese siempre de que el contenido de la variable pasada y devuelta contenga x0A finales de línea utilizando lo siguiente handler y ejemplo código .

A continuación se asume que varText ya ha sido fijado 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)

A continuación, puede volver a utilizar lo siguiente 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 siguiente muestra un ejemplo de llamada al do shell script " sed ..." comando dos veces.

image of code example

0voto

Steve Evans Puntos 155

Vamos a desglosar este scripten trozos más pequeños y luego juntarlo 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 las soluciones serán mucho más cortas, pero usted ha mencionado en otras preguntas que quiere aprender AppleScript.

1. Dividir con delimitadores

Puede utilizar la función de AppleScript delimitadores comportamiento a dividir una cadena . Puede cambiar el delimitador como desee para return , linefeed o incluso personajes 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 indeseables utilizando 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. Combinar los artículos

La lista filtrada de frases puede volver a combinarse mediante 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

Completamente AppleScript

Combinando estos fragmentos se obtiene 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 los bucles de filtrado y recombinación. Los he dejado como tareas separadas para demostrar mejor sus funciones.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X