Tengo la costumbre de escribir una línea por oración porque normalmente compilo cosas en LaTex, o escribo en algún otro formato donde los saltos de línea se ignoran. Yo uso una línea en blanco para indicar el comienzo de un nuevo párrafo.
Ahora, tengo un archivo escrito en este estilo que me gustaría enviar como texto sin formato. Quiero eliminar todos los saltos de línea individuales pero dejar intactos los saltos de línea dobles. Esto es lo que he hecho:
sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt
Esto reemplaza las líneas vacías con algún texto que estoy seguro no aparece en el archivo: NEWLINE
y luego elimina todos los saltos de línea con awk (encontré ese truco en algún sitio web) y luego reemplaza la NEWLINE
s con los dos saltos de línea necesarios .
Esto parece una forma larga y sin aliento de hacer algo bastante simple. ¿Hay alguna forma más simple? Además, si hubiera una manera de reemplazar múltiples espacios (que a veces se arrastran por alguna razón) con espacios individuales, eso también sería bueno.
Uso emacs, así que si hay algún truco específico de emacs que sea bueno, pero preferiría ver una versión pura de sed o awk puro.
tr -d "\n"
.Respuestas:
Puedes usar awk así:
O si necesita una nueva línea adicional al final:
O si desea separar los párrafos por una nueva línea:
Estos comandos awk hacen uso de acciones que están protegidas por patrones:
o
La siguiente acción solo se ejecuta si el patrón coincide con la línea actual.
Y los
^$.
caracteres tienen un significado especial en las expresiones regulares, donde^
coincide con el comienzo de la línea,$
el final y.
un carácter arbitrario.fuente
/./
haciendo: parece estar actuando como yelse
para la/^$/
coincidencia de cuerdas, ¿es así?Use el modo de párrafo Awk o Perl para procesar un archivo párrafo por párrafo, donde los párrafos están separados por líneas en blanco.
Por supuesto, dado que esto no analiza el (La) TeX, mutilará horriblemente los comentarios, los entornos textuales y otras sintaxis especiales. Es posible que desee buscar DeTeX u otros convertidores (La) TeX a texto.
fuente
Solución Sed
Tenga en cuenta que en esta solución
:a
se crea una etiqueta y no se usa ela
comando.Sustitución de espacios múltiples
Uso
tr
:$ tr -s ' ' <test.text
fuente
Si he entendido bien, una línea vacía implica dos nuevas líneas consecutivas,
\n\n
.Si es así, una posible solución sería eliminar todas las ocurrencias singulares de las nuevas líneas.
En Perl, una afirmación anticipada es una forma de lograr esto:
-0777
bandera efectivamente absorbe todo el archivo en una sola cadena-p
le dice a Perl que imprima la cadena en la que está trabajando por defecto-i
especifica la edición en el lugarfuente
(reviviendo una antigua pregunta)
Esto parece ser exactamente lo que
fmt
ypar
son para - apartado cambio de formato. Al igual que usted (y también como muchos programas), definen los límites de los párrafos como una (o más) líneas en blanco. Intenta pasar el texto por uno de estos.fmt
es una utilidad estándar de Unix y se puede encontrar en GNU Coreutils.par
es una gran mejorafmt
escrita por Adam M. Costello que se puede encontrar en http://www.nicemice.net/par/ (también se ha empaquetado para varias distribuciones, incluida debian - la empaqueté para debian en enero de 1996, aunque ahora hay un nuevo mantenedor para el paquete).fuente
sed
agregará cualquier línea alH
espacio antiguo que contenga al menos un solo carácter. Inmediatamente después,d
elige a todos, excepto quizás el último. Las únicas líneas que pueden permanecer son espacios en blanco, y es en estas líneas cuandosed
ex
cambia los espacios de espera y de patrón y elimina todos los\n
caracteres acumulados de línea de hilo.Si desea que las líneas que contienen solo <tabs> o <spaces> se consideren en blanco, reemplace la
/./
dirección anterior con/[^[:blank:]]/
. Para exprimir espacios también:fuente
Después de ver los ejemplos compactos de Perles y Awk de Gilles, era reacio a publicar esto, pero ya había realizado el ejercicio y es un guión funcional, que está razonablemente documentado; este punto solo puede ser de interés para algunos ... (sed con comentarios! :)
Este script considera que las líneas en blanco están en blanco, incluso si contienen espacios en blanco.
Múltiples espacios en el texto se condensan en un solo espacio.
El espacio en blanco al final se elimina de las líneas de texto. Las líneas en blanco consecutivas se contraen en una sola línea. El script deja intactas las líneas en blanco superior e inferior.
Para algo más que los scripts más triviales, sed se puede escribir mucho más fácilmente en una forma estructurada, como un archivo de script separado. Aquí hay tal ejemplo.
usando la
llamada de sintaxis regex extendida : $ sed -rf script text-file
Nota:
flush
en los comentarios, significa: enviar el espacio del patrón al manejo interno de sed de stdout. No significa una impresión definitiva a stdout. La salida depende de la-n
opción de sed . p.ej. elq
comando significa enjuagar y salir ... Compare estos dos fragmentos:echo x |sed -e q
imprime x,echo x |sed -ne q
no imprime nada, mientras que usar elp
comando imprimiría 'x' dos o una vez, dependiendo de la-n
opción.fuente
Aquí hay otra
sed
solución que concatena todas las líneas ensed
el "espacio de retención" para que obtengamos una cadena larga que finalmente se copia en el "espacio del patrón" para la coincidencia de patrones.Como las líneas nuevas se conservarán en la cadena larga final en
sed
el "espacio de patrón", las líneas vacías en términos de saltos de línea dobles[^\n]\n\n[^\n]
se pueden combinar y modificar[^\n]\n[^\n]
.Para obtener más información, consulte, por ejemplo, sed y Búsqueda y reemplazo de varias líneas .
fuente
Esto podría ser de la vieja escuela:
Esto generará el texto alineado a la izquierda (
.ad l
), con una longitud de línea de 80 (.ll 80
). La opción de longitud de página (.pl
) le dice al procesador de texto que complete el relleno de página para una longitud de página de 1, por lo que no hay relleno de página.Si quiere todos sus párrafos en una sola línea, puede usar un número grande para
.ll
:man 7 groff para más opciones de formato.
fuente
En Emacs, a veces uso esto
regex
:Medio:
fuente
Resulta que con
auto-fill-mode
on, emacs hace un trabajo bastante bueno para mis casos de uso simples con soloM-q
...fuente
auto-fill-mode
que depende de qué modo principal tiene activo.