J'ai besoin de modifier un fichier comme celui-ci:
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
l'objectif est de supprimer les lignes commençant par «iface ... inet6» et également de supprimer les suivantes commençant par l'espace (peut être aucune ou plusieurs):
iface wlx000 inet6 auto
post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
et garder le reste intact pour le résultat suivant:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000
J'ai essayé avec sed en utilisant comme suit:
sed -i.old -r -e "/iface\s*\w*\s*inet6.*/,\${d;/^\s.*/d;}" /etc/configfile
mais il supprime tout en commençant au bon endroit mais en effaçant jusqu'à la fin. Je veux juste supprimer les lignes qui regardent l'espace après le texte iface sélectionné.
Réponses:
Essayez cette adaptation de votre
sed
one liner:Il correspond à la plage de votre premier modèle à la première ligne ne commençant pas par un caractère d'espace et supprime les lignes commençant par un espace ou un "i" (pour l'interlignage
iface
). Besoin de repenser sii
nécessaire après le blocage.On dirait que cela fonctionne:
Veuillez essayer de faire rapport.
la source
Un script pour standard
sed
qui utilise une boucle explicite pour supprimer les lignes:Le script trouve les
inet6
lignes, puis ajoute la ligne suivante à cette ligne en interne dans l'espace de motif (avec un caractère de nouvelle ligne incorporé entre les deux). Il supprime ensuite l'espace de motif jusqu'au premier caractère de nouvelle ligne inclus (cela supprime lainet6
ligne d' origine ). Il continue ainsi jusqu'à ce que l'espace de motif ne commence pas par un caractère vide (espace ou tabulation).Essai:
Test sur données artificielles:
Le script en "one-liner":
la source
Vous avez déjà de bonnes réponses pour l'
sed
outil, mais permettez-moi d'en proposer une autre, je pense beaucoup plus simple, en utilisantpcregrep
:L'expression régulière doit être explicite - nous recherchons un motif à partir de la ligne
^iface.*inet6
puis un groupe de n'importe quel caractère OU une nouvelle ligne suivie d'un espace unique répété zéro ou plusieurs fois. Ensuite, nous avons juste besoin d'instruirepcregrep
pour autoriser la correspondance multi-linéaire avec-M
option et inverser le tout par-v
(la partie correspondante sera supprimée).la source
pcregrep
, beaucoup plus intuitif.