Decir que tengo algo de arbitrario multi-línea del archivo de texto:

sometext
moretext
lastline

¿Cómo puedo quitar sólo el último carácter (el correo, no el caracter de fin de línea o nulo) del archivo sin el archivo de texto no válido?

  • Lo que han hecho para solucionar esto? -1
  • La inclusión de un montón de basura sed y awk comandos que tira el último carácter de cada línea no se sentía terriblemente constructivo. Je, sabía que me iba a conseguir sonó para que uno. Aún así, no podía decidirme a dejar en la frase «he intentado un montón de sed y awk, pero sólo podía tira de cada línea de la última char en una variedad de formas».
InformationsquelleAutor MaxPRafferty | 2014-12-04

8 Comentarios

  1. 70

    Un enfoque más sencillo (salidas a stdout, no se actualiza el archivo de entrada):

    sed '$ s/.$//' somefile
    • $ es una Sed dirección que coincida con la última línea de entrada, por lo tanto causando la siguiente llamada de función (s/.$//) a ser ejecutado en la última línea.
    • s/.$// reemplaza el último carácter en el (en este caso última) de la línea con una cadena vacía; es decir, se elimina el último carácter. (antes de que el salto de línea) en la línea.

      . coincide con cualquier carácter en la línea, y siguiendo con $ los anclajes de la coincidencia con el final de la línea; nota cómo el uso de $ en este expresión regular es conceptualmente relacionados, pero técnicamente distinto de los anteriores el uso de $ como una Sed dirección.
    • Ejemplo con la entrada estándar de entrada (se asume que el Bash, Ksh, o Zsh):

      $ sed '$ s/.$//' <<< $'line one\nline two'
      line one
      line tw

    A actualizar el archivo de entrada demasiado (no usar si el archivo de entrada es un enlace simbólico (symlink):

    sed -i '$ s/.$//' somefile

    Nota:

    * En OSX, usted tendría que usar -i '' en lugar de sólo -i; para una visión general de los riesgos asociados con -i, ver la mitad inferior de mi respuesta aquí.

    * Si usted necesita proceso muy grande de archivos de entrada y/o de rendimiento o uso de disco son una preocupación y estás usando GNU utilidades (Linux), ver sorontar útil respuesta.

  2. 39

    truncate

    truncate -s-1 file

    Quita uno (-1) de caracteres desde el final del mismo archivo. Exactamente como un >> se anexará a la misma archivo.

    El problema con este enfoque es que no retener un final de salto de línea, si existiese.

    La solución es:

    if     [ -n "$(tail -c1 file)" ]    # if the file has not a trailing new line.
    then
           truncate -s-1 file           # remove one char as the question request.
    else
           truncate -s-2 file           # remove the last two characters
           echo "" >> file              # add the trailing new line back
    fi

    Esto funciona porque la cola ocupa el último byte (no char).

    Casi no requiere tiempo, incluso con archivos de gran tamaño.

    ¿Por qué no sed

    El problema con una sed solución como sed '$ s/.$//' file es que se lee todo el archivo primero (tomar un largo tiempo con archivos de gran tamaño), entonces usted necesita un archivo temporal (del mismo tamaño que el original):

    sed '$ s/.$//' file  > tempfile
    rm file; mv tempfile file

    Y, a continuación, mueva el tempfile para reemplazar el archivo.

    • Muy bonito! No sabía acerca de truncar, gracias.
    • no se puede acceder en macos?
  3. 4

    Aquí otra utilizando ex, que me parece no tan críptico como la sed solución:

     printf '%s\n' '$' 's/.$//' wq | ex somefile

    La $ va a la última línea, la s elimina el último carácter, y wq es el bien conocido (a vi de los usuarios) escribir+a dejar de fumar.

  4. 2

    Si el objetivo es eliminar el último carácter en la última línea, este awk debe hacer:

    awk '{a[NR]=$0} END {for (i=1;i<NR;i++) print a[i];sub(/.$/,"",a[NR]);print a[NR]}' file
    sometext
    moretext
    lastlin

    Es almacenar todos los datos en una matriz y, a continuación, imprimirlo y el cambio de la última línea.

    • No tuve la suerte de tratar a > para el mismo archivo. Recomendaría la salida a archivo nuevo, borrar el fichero antiguo, a continuación, haciendo un nombre de archivo, cambiar si es necesario.
    • Gnu Awk 4.1 y versiones tiene en línea de edición, así que trate de awk -i 'your code' file
  5. 1

    Después de un montón de jugar con diferentes estrategias (y evitar la sed-i o perl), la mejor manera que he encontrado de hacerlo era con:

    sed '$! { P; D; }; s/.$//' somefile
    • No sé por qué evitar sed -i. Esta es sólo una función para volver a escribir datos en el archivo. Ahora sólo obtener una salida para monitor.
  6. 1

    EDITADO RESPUESTA

    He creado un script y poner el texto dentro en mi Escritorio. esta prueba se guarda el archivo como «old_file.txt»

    sometext
    moretext
    lastline

    Después escribí un pequeño script para tomar el antiguo archivo y eliminar la último carácter en la última línea

    #!/bin/bash
    no_of_new_line_characters=`wc  '/root/Desktop/old_file.txt'|cut -d ' ' -f2`
    let "no_of_lines=no_of_new_line_characters+1"
    sed -n 1,"$no_of_new_line_characters"p  '/root/Desktop/old_file.txt' > '/root/Desktop/my_new_file'
    sed -n "$no_of_lines","$no_of_lines"p '/root/Desktop/old_file.txt'|sed 's/.$//g' >> '/root/Desktop/my_new_file'

    la apertura de la new_file he creado, mostró la salida de la siguiente manera:

    sometext
    moretext
    lastlin

    Pido disculpas por mi respuesta anterior (no leer con cuidado)

    • Pregunta sólo para eliminar el último carácter de un archivo, no el último carácter de cada línea.
    • Pido disculpas por mi respuesta fue no leer con cuidado..yo era capaz de conseguir la solución mediante un pequeño script que he creado. Espero que esto ayude MaxPRafferty
  7. 1

    Una observación: sed va a quitar temporalmente el archivo.
    Así que si usted está persiguiendo el archivo, usted obtendrá un «No existe el fichero o directorio» advertencia hasta que se vuelva a emitir la cola de comandos.

  8. 0

    sed 's/.$//' filename | tee newFilename

    Esto debe hacer su trabajo.

    • Que se retire el último carácter de cada línea, no sólo el último carácter de la última línea.
    • mi mal. Pensé que la pregunta era para eliminar el último carácter de cada línea

Dejar respuesta

Please enter your comment!
Please enter your name here