una sustituir reemplazar lineas linea especiales eliminar caracteres caracter cadena añadir regex bash

regex - sustituir - ¿Cómo puedo reemplazar varias líneas vacías con una sola línea vacía en bash?



sed shell (13)

Acabo de resolver este problema por sed . Incluso si esta es una pregunta de hace 7 años, alguien puede pedir ayuda aquí, así que estoy escribiendo mi solución aquí:

sed ''N;/^/n$/D;P;D;''

Tengo un archivo que contiene:

something something else something else again

Necesito un comando bash, sed / grep nosotros que producirá la siguiente salida

something something else something else again

En otras palabras, necesito reemplazar múltiples líneas en blanco con solo una línea en blanco. grep / sed están basados ​​en línea. Nunca he encontrado una solución de BASH que funcione en patrones de expresiones regulares de varias líneas.


En realidad, si reemplaza varias líneas nuevas con una nueva línea individual, la salida sería:

something something else something else again

Puedes lograr esto de la siguiente manera:

sed /^$/d FILE


Esto usa la solución de Marco en múltiples archivos:

for i in *; do FILE=$(cat -s "$i"); echo "$FILE" > "$i"; done


Generalmente, si encuentro que sed no puede hacer algo que necesito, me dirijo a awk:

awk '' BEGIN { blank = 0; } /^[[:blank:]]*$/ { if (!blank) { print; } blank = 1; next; } { print; blank = 0; }'' file


Para sistemas derivados de BSD (incluido GNU):

Solo necesitas cat con la opción -s que hace que elimine líneas vacías repetidas de su salida:

cat -s

Desde la página man: -s --squeeze-blank: suppress repeated empty output lines.


Pipelining a | uniq puede ser una solución (si no se duplican las líneas vacías)


Python, con expresión regular:

import re import sys sys.stdout.write(re.sub(''/n{2,}'',''/n/n'', sys.stdin.read()))


Súper fácil de hacer con vim. Simplemente abra el archivo y escriba lo siguiente:

:%s//n/n/n*//r/r/

Eso reducirá todos los bloques de más de 2 nuevas líneas a 2 nuevas líneas. ¡Espero que esto ayude!


Si alguien quiere usar perl

perl -00pe0 < file

hará lo mismo, como cat -s :)


Supongo que probablemente quiera eliminar las líneas que solo tienen espacios en blanco.

Eso se puede hacer con:

sed /^[:space:]*$/d FILE


Una solución con awk , que reemplaza varias líneas en blanco con una sola línea en blanco:

awk ''BEGIN{bl=0}/^$/{bl++;if(bl==1)print;else next}/^..*$/{bl=0;print}'' myfile


Use Python:

s = file("filename.txt").read() while "/n/n/n" in s: s = s.replace("/n/n/n", "/n/n") import sys sys.stdout.write(s)


grep -A1 . <yourfile> | grep -v "^--$"

Esta solución grep funciona suponiendo que desea lo siguiente:

Entrada

line1 line2 line3 line4 line5

Salida

line1 line2 line3 line4 line5