$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msges decir, quiero que se agregue \ndespués de 72 caracteres y continúe, por lo que inicialmente es posible que deba eliminar todos los mensajes individuales \ny agregarlos. Puede ser más fácil ser más fácil con otra herramienta, pero intentemos awk.
[Actualizar]
Williamson proporcionó la respuesta correcta pero se necesitó ayuda para leerla. Divido el problema en partes con ejemplos más simples, a continuación.
- ¿Por qué el siguiente código impreso - \ten ambos casos- gsubdebería sustituir las cosas? x es un archivo ficticio, algunos 0 impares al final.
- Al atacar la línea - line = $0 \n more = getline \n gsub("\t"," ")en la respuesta de Williamson ,- lineaparentemente obtiene un stdout completo mientras se- moreobtiene el valor emergente- $0, ¿verdad?
Código de la parte 1
$ gawk '{ hallo="tjena\t tjena2"; gsub("\t"," "); }; END {print hallo; gsub("\t", ""); hallo=hallo gsub("\t",""); print hallo }' x
tjena  tjena2
tjena  tjena20fuente

No estoy usando awk
Entiendo que esto puede ser solo una parte de un problema mayor que está tratando de resolver usando
awko simplemente un intento de comprender mejor, pero si realmente solo desea mantener la longitud de su línea en 72 columnas, hay una herramienta mucho mejor.La
fmtherramienta se diseñó específicamente con esto en mente:fmtTambién intentará romper las líneas en lugares razonables, haciendo que la salida sea más agradable de leer. Consulte lainfopágina para obtener más detalles sobre lo que sefmtconsidera "lugares razonables".fuente
widthsignifica bytes, no caracteres.fold -s -w 72foldtambién funcionará en sistemas GNU (viene con GNUcoreutils).Awk es un lenguaje completo de Turing, y no uno particularmente ofuscado, por lo que es bastante fácil truncar líneas. Aquí hay una versión sencilla e imperativa.
Si desea truncar líneas entre palabras, puede codificarlas en awk, pero reconocer palabras no es trivial (por razones que tienen más que ver con lenguajes naturales que con dificultad algorítmica). Muchos sistemas tienen una utilidad llamada
fmtque hace exactamente eso.fuente
Aquí hay una función Awk que se rompe en espacios:
Sorprendentemente, esto es más eficaz que fold o fmt .
Fuente
fuente
Usted preguntó por qué el
awkcódigo emitía pestañas y de dónde provenía el cero.El código no modifica la
hellocadena con lasgsub()llamadas. Con dos argumentos,gsub()actúa sobre$0. Para modificar realmente lahallovariable, usegsub(..., ..., hallo).Obtiene el cero al final de la cadena porque
gsub()devuelve el número de sustituciones realizadas, y en un punto agrega este número al valor dehallo.Soy consciente de al menos tres utilidades que son específicamente para envolver y formatear párrafos de texto:
fold, "filtro para líneas plegables", que es una utilidad POSIX estándar . Simplemente inserta nuevas líneas y no redistribuye el texto.fmt, "formateador de texto simple", que a menudo también se instala en los sistemas Unix de forma predeterminada y un poco más inteligente quefoldcuando se trata de refluir párrafos.par, " filtro para reformatear párrafos ", que tiene capacidades adicionales para detectar prefijos y sufijos de párrafo (como un texto con un cuadro ASCII alrededor, o comentarios en un poco de código fuente), y maneja la sangría y las sangrías colgantes un poco mejor quefmt.fuente
Usando gensub, para obtener
foldsemántica, podría ejecutar algo en la línea defuente