Je veux créer un modèle qui trouvera la première chaîne qui correspond au modèle et le remplace:
sed -r '0,/^[a-z0-9]* (ALL=\(ALL\) ALL)/s//abc \1\n&/'
Mon entrée est un fichier / etc / sudoers
.
Je voudrais changer ^ [a-z0-9] *
en quelque chose comme / ^ ALL /!
mais cela ne fonctionne pas pour moi.
3 Réponses :
Je suppose que vous aimez supprimer abc
de votre chaîne, ce que cette expression pourrait vous aider à faire:
(ALL=(ALL) ALL)/s//
#!/bin/bash STRING="(ALL=(ALL) ALL)/s//abc" MATCH="$(sed 's/\([^abc]*\)\(.*\)/\1/' <<< $STRING)" echo $MATCH
([^abc]*)(.*)
Si ce n'était pas le cas votre expression souhaitée, vous pouvez modifier / changer vos expressions dans regex101.com .
Vous pouvez également visualiser vos expressions dans jex.im :
Non, je voudrais créer une expression régulière qui correspond à
où la chaîne peut être tout, mais pas «ALL».
Remplacement de la première occurrence dans le fichier
Si je comprends votre question et que vous souhaitez trouver la première chaîne du fichier qui correspond à ^ [a-z0-9] + ALL = (ALL) ALL
et remplacez ^ [a-z0-9] + ALL
par quelque chose comme ^ ABC
en utilisant Expression régulière étendue , vous pouvez utiliser:
sed 's/[0-9a-z][0-9a-z]*/cde456/1`
En regardant les lignes non commentées dans un / etc / sudoers
avec un accès sudo
fourni à membres du groupe wheel
, vous auriez:
$ echo "abc123---abc123---abc123" | sed -r 's/[0-9a-z]+/cde456/2' abc123---cde456---abc123
Donc pour remplacer la première chaîne par [a-z0-9] + ALL = (ALL) ALL
dans / etc / sudoers
avec ^ ABC = (ALL) ALL
, vous devriez:
$ echo "abc123---abc123---abc123" | sed -r 's/[0-9a-z]+/cde456/1' cde456---abc123---abc123
Je voudrais créer une expression régulière qui correspond à
Je comprends que vous voulez éviter de faire correspondre la première occurrence d'un modèle si ALL
est présent dans la partie avant la sous-chaîne ALL = (ALL) ALL
.
Utilisez
sed -i '' -e '/^.*ALL.* ALL=(ALL) ALL/b' -e 's/^.* \(ALL=(ALL) ALL\)/abc \1\n&/' -e ':a;n;ba' file
Si vous n'avez pas de GNU sed
, vous pouvez essayer
sed -i '/^.*ALL.* ALL=(ALL) ALL/b;s/^.* \(ALL=(ALL) ALL\)/abc \1\n&/;T;:a;n;ba' file
REMARQUES
/^.*ALL.* ALL = (ALL) ALL / b;
- trouve la ligne ayant ALL
avant ALL = (ALL) ALL et arrête de traiter cette ligne
s /^.* \ (ALL = (ALL) ALL \) / abc \ 1 \ n & /
effectue le remplacement (notez que . *
correspondra à n'importe quel 0 ou plus de caractères autant que possible) T
- en cas d'échec, terminer le traitement de cette ligne : a; n; ba
- une boucle qui permet à sed de simplement lire et imprimer le reste des lignes jusqu'à la fin du fichier.
Si vous êtes encore occupé, veuillez clarifier: voulez-vous ignorer (éviter la correspondance)
abcALL ALL = (ALL) ALL
ouabc ALL = (ALL) ALL ... ALL. ..
? Ou les deux?