¿Cómo eliminar una línea específica de un párrafo en AppleScript, conservando el formatting original del text?

Tengo una variable de text text de class 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 eliminar líneas específicas del text, sin afectar el rest de la variable.

  • Script de Apple para bloquear la computadora usando knock
  • La VM que ejecuta Sierra 10.12.3 en Parallels 12 deja de responder al mouse
  • Diferentes resultados de ejecutar el mismo AppleScript
  • Weird Safari pixelating problema
  • Cómo usar el server VPN integrado en Mac OS 10.6.6
  • AppleScript: get respuesta y botones de dialog de visualización
  • Por ejemplo: delete {1, 3} para get 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:

    "¿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 convierte realmente todos los avances de línea en la variable de text a 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 

    devoluciones

    ""

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


    Por lo tanto, quiero una solución que me permita ejecutar la misma variable de text 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 ningún lugar del text.

  • ¿Qué está causando que el software esté actualizado para usar resources excesivos y matar la capacidad de respuesta de mi Mac?
  • ¿Una aplicación de calendar que muestra diferentes proyectos uno al lado del otro en columnas?
  • ¿Cómo permanezco en el mismo escritorio cuando cambio a una aplicación de pantalla completa?
  • Problemas con la batería Macbook Pro / tarjeta gráfica discreta en 10.8.2
  • ¿Recuperar datos después de reinstalar OS X?
  • Mac OS X no puede encontrar el disco duro (en cualquier lugar)
  • 3 Solutions collect form web for “¿Cómo eliminar una línea específica de un párrafo en AppleScript, conservando el formatting original del text?”

    De acuerdo, eliminé la edición original y la primera porque editó su 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 un ejemplo de cómo se puede establecer la variable, la includeé 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 este caso, el return es x0D frente al uso más apropiado del x0A de linefeed ( x0A ), en el caso en que la variable es información y no un post 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 en realidad termina con un linefeed ( x0A ) como debería ser en una Mac.

    El command do shell script tiene un error ya que convierte x0A en x0D después de lo que se devuelve desde la command-line que tiene las terminaciones x0A esperadas. 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, el x0A contiene terminaciones de x0A linefeed ( x0A ), por lo que lo mismo se devuelve para do shell script pero luego convierte erróneamente las x0A línea x0D terminaciones x0D que luego pueden manejarse de la siguiente manera:

    Entonces, para acomodar el error , siempre asegure que el contenido de la variable pasada y devuelta contenga x0A línea x0A usando el siguiente handler y código de ejemplo.

    Lo siguiente asume que varText ya ha sido establecido por cualquiera de los methods 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 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 siguiente image muestra un ejemplo de invocar el command do shell script " sed ..." dos veces.

    imagen del ejemplo del código

    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 

    Devoluciones:

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

    Actualización: como resultado de un descubrimiento mencionado en Editar: ¿Cómo eliminar una línea específica de un párrafo basado en "retorno" en AppleScript? , déjame hacer la siguiente statement:

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

    Es un error porque: El command do shell script "sed ..." cuando se ejecuta en Terminal con ese varText regresa con \n (x0A) not \r (x0D) como se supone que debe hacerlo. Incluso el command comstackdo do shell script "sed ..." en Script Editor todavía tiene \n (x0A) no \r (x0D), pero por qué se devuelve con \r (x0D) la intención del esperado \n (x0A) es es un misterio para mí en este momento y voy a considerar esto como un error de AppleScript ya que no refleja el comportamiento esperado de la misma cuando se ejecuta en la Terminal.

    Entonces, para dar count del error en los resultados del command do shell script "sed ..." , así es como lo manejaría. Después del command 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 nuevos caracteres de línea (x0A) , como debería tener, para empezar si no hubiera este error, no caracteres de retorno de carro (x0D).


    Nota: Cuando se comstack, la línea de código set newLine to "\n" se mostrará de la siguiente manera:

     set newLine to " " 

    Vamos a dividir este guión en piezas más pequeñas y luego poner todo junto 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 desea aprender AppleScript.

    1. Dividir con Delimitadores

    Puede usar el comportamiento de los delimitadores de AppleScript para dividir una cadena . Puede cambiar el delimitador como desee para 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 {""} --> restre 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 filters

    Con la list 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 artículos

    La list filtrada de oraciones se puede volver a combinar usando otro ciclo:

     -- Combine the filtenetworking 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

    La combinación de estos fragments 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 filtenetworking 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 {""} --> restre delimiters to default value return someText end split 

    El script anterior se puede networkingucir combinando los ciclos de filter y recombinación. Los dejo como tareas separadas para demostrar mejor sus roles.

    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).