1
votes

Annuler une partie du motif à l'aide de sed

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.


1 commentaires

Si vous êtes encore occupé, veuillez clarifier: voulez-vous ignorer (éviter la correspondance) abcALL ALL = (ALL) ALL ou abc ALL = (ALL) ALL ... ALL. .. ? Ou les deux?


3 Réponses :


1
votes

Je suppose que vous aimez supprimer abc de votre chaîne, ce que cette expression pourrait vous aider à faire:

(ALL=(ALL) ALL)/s//

 entrez la description de l'image ici

#!/bin/bash
STRING="(ALL=(ALL) ALL)/s//abc"
MATCH="$(sed 's/\([^abc]*\)\(.*\)/\1/' <<< $STRING)"
echo $MATCH

Output

([^abc]*)(.*)

RegEx

Si ce n'était pas le cas votre expression souhaitée, vous pouvez modifier / changer vos expressions dans regex101.com .

Circuit RegEx

Vous pouvez également visualiser vos expressions dans jex.im :

 entrez la description de l'image ici


1 commentaires

Non, je voudrais créer une expression régulière qui correspond à ALL = (ALL) ALL où la chaîne peut être tout, mais pas «ALL».



1
votes

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


1 commentaires

Je voudrais créer une expression régulière qui correspond à ALL = (ALL) ALL où la chaîne peut être tout, mais pas «ALL».



0
votes

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.


0 commentaires