2009-07-27 14 views
20

Estoy buscando un guión bash o sed (preferiblemente un trazador de líneas) con el que puedo insertar un nuevo carácter de línea después de un número fijo de caracteres en un archivo de texto enormeCómo insertar un nuevo carácter de línea después de un número fijo de caracteres en un archivo

+0

Dupe of http://stackoverflow.com/questions/525592/find-and-replace-inside-a-text-from-a-bash-command entre muchos, muchos otros –

+4

No estoy de acuerdo con el comentario dupe aquí, Neil: esta no es una simple búsqueda y reemplazo como la pregunta en su enlace ... – Kristian

Respuesta

32

¿Qué tal algo así? Cambio 20 es el número de caracteres antes de la nueva línea, y temp.text es el archivo para reemplazar en ..

sed -e "s/.\{20\}/&\n/g" < temp.txt 
+2

Falla si el archivo contiene un carácter '~' –

+1

Esto inserta una línea nueva después de * cada * 20 caracteres (por línea del original). Si el original no contiene líneas nuevas y desea una nueva línea después de los primeros 20 caracteres, omita la "g" (global) al final. Si quiere esto y el original contiene nuevas líneas, tendrá que usar una solución diferente. –

+0

Tuve el mismo problema pero en OSX inserta una "n" en lugar de un salto de línea? Revisé otras publicaciones con el mismo problema, pero no pude entender cómo solucionarlo. ¿Alguien por favor? – JM88

0

si usted quiere decir que desea insertar su nueva línea después de una serie de caracteres con respecto a todo el archivo , por ejemplo, después de que el carácter número 30 en todo el archivo

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 al número específico de caracteres en cada línea, por ejemplo después de cada quinto carácter

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

Anexar una adelantarse y la línea después de una línea con exactamente 42 caracteres

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

Sea N una variable de shell que representa el recuento de caracteres tras los cuales desea un salto de línea. Si desea continuar cruzando las líneas de conteo:

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

Si desea reiniciar el contador para cada línea, omite el argumento -0xff.

0

Esto podría funcionar para usted:

echo aaaaaaaaaaaaaaaaaaaax | sed 's/./&\n/20' 
aaaaaaaaaaaaaaaaaaaa 
x 
+0

, literalmente, solo funciona para la primera línea (por ejemplo, inserta una línea nueva después de 20 caracteres y luego se cierra). No es adecuado para "un archivo de texto enorme". – michael

26

Aquí está la solución de POSIX:

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, la solución Awk es más performant de doblar.

+2

He visto esto probado de diferentes maneras, pero siempre hay casos especiales, diferencias de versión, otros problemas, o la solución es sencillamente poco elegante. 'fold' es * definitivamente * la herramienta correcta para esto. +1 – laindir

+1

'fold' debería ser la respuesta correcta. 'man fold' da' envolver cada línea de entrada para que encaje en el ancho especificado'. ¡Responde la pregunta perfectamente! – dcousens

+0

desafortunadamente 'fold' no maneja nada más que archivos simples de ASCII, desafortunadamente, solo intente probar en cualquier archivo Unicode (por ejemplo, con comillas Unicode especiales, etc.), hace un lío de cosas. El 'awk..gsub' funciona, sin embargo. – michael

Cuestiones relacionadas