Necesito editar un archivo como el siguiente:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
iface wlx000 inet6 auto
  post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
auto wlx000el objetivo es eliminar las líneas que comienzan con 'iface ... inet6' y también eliminar las siguientes que comienzan con espacio (puede ser ninguna o más de una):
iface wlx000 inet6 auto
  post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2y mantenga el resto intacto para el siguiente resultado:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000Intenté con sed usando lo siguiente:
sed -i.old -r -e "/iface\s*\w*\s*inet6.*/,\${d;/^\s.*/d;}" /etc/configfilepero elimina todo comenzando en el lugar correcto pero borrándose hasta el final. Solo quiero eliminar las líneas que miran con espacio después del texto de selección de iface.
                    
                        text-processing
                                awk
                                sed
                                
                    
                    
                        fcm
fuente
                
                fuente

Respuestas:
Pruebe esta adaptación de su
sedforro único:Coincide con el rango desde su primer patrón hasta la primera línea que NO comienza con un carácter de espacio, y elimina las líneas que comienzan con espacio o una "i" (para el inicio
iface). Es necesario repensar siise requiere después del bloqueo.Parece que esto funciona:
Por favor, intente y vuelva a informar.
fuente
Un script para estándar
sedque usa un bucle explícito para eliminar las líneas:El script encuentra las
inet6líneas y luego agrega la siguiente línea a esa línea internamente en el espacio del patrón (con un carácter de nueva línea incrustado en el medio). Luego elimina el espacio del patrón hasta el primer carácter de nueva línea (esto elimina lainet6línea original ). Continúa haciendo esto hasta que el espacio del patrón no comience con un carácter en blanco (espacio o tabulación).Pruebas:
Pruebas en datos artificiales:
El guión como "one-liner":
fuente
Ya tiene buenas respuestas para la
sedherramienta, pero permítame proponer otro enfoque, creo que mucho más simple, que utilizapcregrep:La expresión regular debe explicarse por sí misma: buscamos un patrón que comience desde la línea
^iface.*inet6y luego agrupemos cualquier carácter O línea nueva seguida de un espacio simple repetido cero o más veces. Luego solo necesitamos instruirpcregreppara permitir la coincidencia multilineal con la-Mopción y revertir todo-v(se eliminará la parte coincidente).fuente
pcregrep, mucho más intuitivo.