Comment puis-je ajouter une ligne de texte au moyen d'un fichier à l'aide de bash?
J'essaye d'ajouter une ligne de texte au moyen d'un fichier texte dans un script bash. Plus précisément, je suis en train d'ajouter un serveur de noms pour mon /etc/resolv.fichier conf. Comme il est, resolv.conf ressemble à ceci:
# Generated by NetworkManager
domain dhcp.example.com
search dhcp.example.com
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3
Mon but est d'ajouter nameserver 127.0.0.1
au-dessus de tous les autres serveur de noms de lignes, mais en dessous de tout texte ci-dessus que. En fin de compte, je veux que ma résolution.fichier conf ressemble à ceci:
# Generated by NetworkManager
domain dhcp.example.com
search dhcp.example.com
nameserver 127.0.0.1
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3
Comment est-ce possible via un script bash? Est-ce quelque chose sed ou awk peut faire? Ou serait-creative greping pour recréer le fichier sera mon meilleur coup?
Vous devez vous connecter pour publier un commentaire.
Voici une solution à l'aide de sed:
Comment cela fonctionne: d'abord, éviter la sortie de sed avec le
-n
drapeau. Ensuite, pour chaque ligne, on ajoute la ligne de l'emprise de l'espace, en les séparant par des retours à la ligne:Lorsque nous arrivons à la fin du fichier (adressée par
$
) nous déplacer le contenu de la soute de l'espace pour le modèle de l'espace:Si la première ligne dans le modèle de l'espace est vide, nous le remplacer par rien.
Puis on remplace la première ligne de départ avec
nameserver
par une ligne contenantnameserver 127.0.0.1
, une nouvelle ligne (Votre version desed
ne peut pas soutenir\n
, dans ce cas remplacer len
avec un littéral de retour à la ligne) et la ligne d'origine (représenté par&
):Maintenant nous avons juste besoin d'imprimer les résultats:
sed -n 'H;${x;s/^\n//;s/nameserver .*\n/nameserver 127.0.0.1\n&/;p;}' resolv.conf
, cependant, permet de résoudre ce problème. J'ai ajoutés/^\n//
à la commande, donc il va supprimer le saut de ligne au début du contenu du modèle de l'espace.sed -n 'H;${x;s/^\n//;s/nameserver .*$/nameserver 127.0.0.1\n&/;p;}' resolv.conf
Maintenant nous remplacer à partir du premier serveur de noms de domaine jusqu'à la fin du fichier - j'ai remplacé le\n
dans/nameserver .*\n/
par le marqueur de fin de ligne$
. Encore une fois, pas que le\n
dans/nameserver 127.0.0.1\n&/
peut être remplacé par un ` suivi par un saut de ligne dans certaines versions numérisées.En supposant que vous souhaitez insérer immédiatement après le
search
ligne, c'est beaucoup plus simple:-i
: modifier le fichier en place-e
: permet l'exécution d'un script/commandes à l'intérieur de sed expressiona mynewtext
: commande qui indique à sed pour insérer le texte mynewtext après le motif correspondant#<<INSERT>>
ou quelque chose. Alors, au lieu de/^search/
vous pouvez regarder pour/^#<<INSERT>>$/
, ce qui rend beaucoup plus susceptibles de correspondre à la mauvaise ligne.nameserver 127.0.0.1
?awk '/^nameserver/&& !modif { printf("INSERT\n"); modif=1 } {print}'
awk
solution, peut-être le seul qui n'est pas de copier l'intégralité du fichier en mémoire...Comment au sujet de quelque chose comme:
(similaire à ceci: sed: Trouver modèle de plus de deux lignes, de ne pas remplacer après ce modèle)
Cela pourrait fonctionner pour vous:
Ou GNU sed:
Voici un Perl solution:
perl -lne 'if (not $f and /^nameserver/){ print "nameserver 127.0.0.1"; $f=1 }; print' resolv.conf
-n
boucle autour de chaque ligne du fichier d'entrée, ne pas imprimer automatiquement chaque ligne-l
supprime les retours à la ligne avant le traitement, et ajoute dans de retour après-e
exécuter le code perl$f
est utilisé comme un indicateur pour indiquer que le serveur de noms de chaîne a déjà été trouvé