$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
es decir, quiero que se agregue \n
después de 72 caracteres y continúe, por lo que inicialmente es posible que deba eliminar todos los mensajes individuales \n
y 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
\t
en ambos casosgsub
deberí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 ,line
aparentemente obtiene un stdout completo mientras semore
obtiene 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 tjena20
fuente
No estoy usando awk
Entiendo que esto puede ser solo una parte de un problema mayor que está tratando de resolver usando
awk
o 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
fmt
herramienta se diseñó específicamente con esto en mente:fmt
También intentará romper las líneas en lugares razonables, haciendo que la salida sea más agradable de leer. Consulte lainfo
página para obtener más detalles sobre lo que sefmt
considera "lugares razonables".fuente
width
significa bytes, no caracteres.fold -s -w 72
fold
tambié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
fmt
que 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
awk
código emitía pestañas y de dónde provenía el cero.El código no modifica la
hello
cadena con lasgsub()
llamadas. Con dos argumentos,gsub()
actúa sobre$0
. Para modificar realmente lahallo
variable, 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 quefold
cuando 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
fold
semántica, podría ejecutar algo en la línea defuente