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