Estoy buscando un bash o sed de secuencia de comandos (preferiblemente de una sola línea) con la que puedo insertar un carácter de nueva línea después de un número fijo de caracteres en el enorme archivo de texto.

  • Víctima de stackoverflow.com/questions/525592/… entre muchos, muchos otros
  • No estoy de acuerdo por la víctima comentario aquí, Neil: esto no es una simple buscar y reemplazar como la pregunta en su enlace..
InformationsquelleAutor rangalo | 2009-07-27

7 Comentarios

  1. 42

    ¿Algo como esto? Cambio 20 es el número de caracteres antes de la nueva línea, y temp.el texto es el archivo a reemplazar en..

    sed -e "s/.\{20\}/&\n/g" < temp.txt
    • Se produce un error si el archivo contiene un caracter ‘~’
    • Esto inserta un salto de línea después de cada de 20 caracteres (por línea de la original). Si el original no contiene saltos de línea y desea una nueva línea después de sólo los primeros 20 caracteres, de salir de la «g» (global) en la final. Si desea que este y el original contiene saltos de línea, usted tendrá que usar una solución diferente.
    • Yo tenía el mismo problema, pero en OSX inserta una «n» en lugar de un salto de línea? He comprobado otros posts con el mismo problema, pero yo no podía entender cómo solucionarlo? Alguien por favor?
    • Unix/Linux utilice el carácter de avance de línea (\n) para los saltos de línea. Mac utiliza el retorno de carro de caracteres para los saltos de línea (\r), y Windows utiliza una combinación de los dos (\r\n) para los saltos de línea. Cambiar el comando para sed -e "s/.\{20\}/&\r/g" < temp.txt, y usted debe obtener lo que necesita. Véase también esta Pila-O y este blog acerca de él.
    • Un montón de sed implementaciones de limitar el número de caracteres seleccionados a 255. Prefiero el de Steven Centavo de su respuesta.
    • No funciona en OSX con un archivo.contiene una cadena codificada en base64.
    • Creo que el uso de fold es más elegante.

  2. 34

    Aquí es POSIX solución:

    awk '{gsub(/.{5}/,"&\n")}1' file

    O:

    fold -w5 file

    De entrada:

    banana strawberry grape

    De salida:

    banan
    a str
    awber
    ry gr
    ape

    Curiosamente, el Awk solución es más eficiente que el pliegue.

    • He visto que esta intentado docenas de diferentes maneras, pero siempre hay casos especiales, las diferencias de versión, otros problemas, la solución es simplemente poco elegante. fold es definitivamente la herramienta adecuada para ello. +1
    • fold debe ser la respuesta correcta. man fold da wrap each input line to fit in specified width. Contesta a la pregunta a la perfección!
    • por desgracia fold no maneja nada que no sea archivos ascii, por desgracia — acabo de probar en cualquier archivo unicode (por ejemplo, con especial unicode citas, etc), se hace un lío de cosas. El awk..gsub funciona, sin embargo.
  3. 2

    N vamos a ser una variable de shell que representa el recuento de caracteres después de que usted desea en una nueva línea. Si usted desea continuar con el recuento a través de líneas:

    perl -0xff -pe 's/(.{'$N'})/$1\n/sg' input

    Si desea reiniciar el recuento de cada línea, se omite el -0xff argumento.

  4. 1

    Porque no puedo comentar directamente (a menos reputación) un nuevo indicio en la parte superior de los comentarios:

    Prefiero el sed comando (exactamente lo que quiero) y también probó el Posix-Comando veces. Pero hay una pequeña diferencia entre ambos comandos para el problema original:
    Si usted tiene un archivo plano con n*bytes de los registros (sin caracteres de avance de línea) y el uso de la sed comando (con bytes (número 20 en la respuesta de @Kristian)) tienes n líneas si se cuenta con wc. Si utiliza el veces comando sólo consiguió n-1 líneas con wc!
    Esta diferencia a veces es importante saber, si el archivo de entrada no contiene ningún carácter de nueva línea, que tiene uno después de la última línea con sed y tengo nadie con veces

  5. 0

    si te refieres a la que desea insertar el salto de línea después de una serie de personajes con respecto a la totalidad del archivo, por ejemplo, después de los 30 caracteres en el archivo de la

    gawk 'BEGIN{ FS=""; ch=30}
    {
        for(i=1;i<=NF;i++){
            c+=1
            if (c==ch){
                print "" 
                c=0           
            }else{
                printf $i
            }
        }
        print ""
    }' file

    si te refieres a insertar en el número específico de caracteres de cada línea, por ejemplo, después de cada 5º carácter

    gawk 'BEGIN{ FS=""; ch=5}
    {
        print substr($0,1,ch) "\n" substr($0,ch)
    }' file
  6. 0

    Anexar una línea vacía después de que una línea con exactamente 42 caracteres

    sed -ie '/^.\{42\}$/a\
    ' huge_text_file
  7. 0

    Esto podría funcionar para usted:

    echo aaaaaaaaaaaaaaaaaaaax | sed 's/./&\n/20'
    aaaaaaaaaaaaaaaaaaaa
    x
    • literalmente sólo funciona para la primera línea (por ejemplo, inserta salto de línea después de 20 caracteres y, a continuación, se cierra). No apto para «un enorme archivo de texto».

Dejar respuesta

Please enter your comment!
Please enter your name here