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 wlx000
el 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=2
y mantenga el resto intacto para el siguiente resultado:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000
Intenté con sed usando lo siguiente:
sed -i.old -r -e "/iface\s*\w*\s*inet6.*/,\${d;/^\s.*/d;}" /etc/configfile
pero 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
sed
forro ú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 sii
se requiere después del bloqueo.Parece que esto funciona:
Por favor, intente y vuelva a informar.
fuente
Un script para estándar
sed
que usa un bucle explícito para eliminar las líneas:El script encuentra las
inet6
lí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 lainet6
lí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
sed
herramienta, 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.*inet6
y luego agrupemos cualquier carácter O línea nueva seguida de un espacio simple repetido cero o más veces. Luego solo necesitamos instruirpcregrep
para permitir la coincidencia multilineal con la-M
opción y revertir todo-v
(se eliminará la parte coincidente).fuente
pcregrep
, mucho más intuitivo.