J'ai un problème similaire. J'ai besoin de déplacer une ligne dans / etc / sudoers à la fin du fichier.
La ligne que je veux déplacer:
#creates variable value
templine=$(cat /etc/sudoers | grep "#includedir /etc/sudoers.d")
#delete value
sed '/"${templine}"/d' /etc/sudoers
#write value to the bottom of the file
cat ${templine} >> /etc/sudoers
J'ai essayé avec une variable
#includedir /etc/sudoers.d
Je n'obtiens aucune erreur ni le résultat que je recherche.
Des suggestions?
4 Réponses :
Avec awk:
$ cat test.txt
hi
this
is
#includedir /etc/sudoers.d
a
test
$ awk '$0=="#includedir /etc/sudoers.d"{lastline=$0;next}{print $0}END{print lastline}' test.txt
hi
this
is
a
test
#includedir /etc/sudoers.d
Cela dit:
$ 0 est "#includedir /etc/sudoers.d" , définissez la variable lastline sur la valeur de cette ligne $ 0 et passez à la ligne suivante next . {print $ 0} lastline . Exemple :
awk '$0=="#includedir /etc/sudoers.d"{lastline=$0;next}{print $0}END{print lastline}' /etc/sudoers
Je teste avec une copie de / etc / sudoers et j'obtiens un résultat comme si une commande ne s'est pas terminée. awk '$ 0 == "# includedir /etc/sudoers.d"{lastline=$0;next}{print $ 0} END {print lastline}` / etc / sudoers>
Mes excuses. J'ai mis à jour la réponse. J'ai mis un backtick à la place du guillemet simple. Cela a été corrigé.
Vous pouvez tout faire avec sed :
sed -e '/#includedir .etc.sudoers.d/ { h; $p; d; }' -e '$G' /etc/sudoers
Cela laisse une ligne vide où se trouvait le #includedir ; pour éviter cela, utilisez {h; d;} au lieu de x .
@BenjaminW .: bon point, et incluez $ p pour fonctionner également lorsque le motif est sur la dernière ligne
Cela peut réduire le fichier si l'expression rationnelle correspond plus d'une fois et ne déplace que la dernière correspondance.
@potong: vrai, mais étant donné le modèle qui est un trait souhaitable ici
Si vous avez plusieurs entrées que vous souhaitez déplacer à la fin du fichier, vous pouvez effectuer les opérations suivantes:
sed -n '/regex/!{p;ba};H;:a;${x;s/.//;p}' file
ou
awk '/regex/{a[++c]=$0;next}1;END{for(i=1;i<=c;++i) print a[i]}' file
Cela pourrait fonctionner pour vous (GNU sed):
sed -n '/regexp/{h;$p;$b;:a;n;p;$!ba;x};p' file
Ceci supprime les lignes contenant une expression régulière spécifiée et les ajoute à la fin du fichier.
Pour déplacer uniquement la première ligne qui correspond à l'expression rationnelle, utilisez:
sed -n '/regexp/H;//!p;$x;$s/.//p' file
Cela utilise une boucle pour lire / imprimer le reste du fichier, puis ajouter la ligne correspondante.
Que faire si
#includedir /etc/sudoers.dn'existe pas dans le fichier?