57 votes

sed : Mon motif peut-il contenir un caractère " n'est pas " ? Comment dire "n'est pas X" ?

Comment puis-je dire "n'est pas" un certain caractère en sed ?

2 votes

[^X] est un caractère quelconque, mais X . PS : bien que nous sachions ce que vous voulez dire, SED ne devrait pas prendre la majuscule.

0 votes

@Sanjay Ok je vais dé-capitaliser sed. Pouvez-vous poster une réponse dans la section des réponses la prochaine fois, et non dans les commentaires ?

78voto

Tom Zych Points 5577
[^x]

Il s'agit d'une classe de caractères qui accepte n'importe quel caractère sauf x .

15 votes

Je vais ajouter un avertissement de Mastering Regular Expressions. Notez que pour que cela corresponde, il doit y avoir quelque chose. L'expression régulière 'su[^x]' correspondra à 'sum' et 'sun' mais pas à 'su'.

1 votes

Comment le réparer dans le cas où vous avez mentionné 'su' ?

0 votes

@jcalfee314, je pense que cela devrait fonctionner si l'on y ajoute un ? comme 'su[^x]?', ce qui signifie que cela devrait correspondre à zéro ou un de ces caractères.

19voto

Pour ceux non satisfait de la réponse choisie selon commentaire de johnny .

'su[^x]' correspondra à 'sum' et 'sun' mais pas à 'su'.

Vous pouvez dire à sed de not correspond aux lignes avec x en utilisant la syntaxe ci-dessous :

sed '/x/! s/su//' file

Voir la réponse de kkeller pour un autre exemple.

10voto

tripleee Points 28746

Il y a deux interprétations possibles de votre question. Comme d'autres l'ont déjà souligné, [^x] correspond à un seul caractère qui n'est pas x . Mais une chaîne vide n'est pas non plus x alors peut-être cherchez-vous [^x]\|^$ .

Aucune de ces réponses ne s'étend aux séquences de plusieurs caractères, ce qui est généralement ce que les gens recherchent. Vous pourriez construire minutieusement quelque chose comme

[^s]\|s\($\|[^t]\|t\($\|[^r]\)\)\)

pour composer une expression régulière qui ne correspond pas à str mais une solution beaucoup plus simple en sed est de supprimer toute ligne qui fait match str puis gardez le reste ;

sed '/str/d' file

Perl 5 a introduit un moteur regex beaucoup plus riche, qui est désormais standard en Java, PHP, Python, etc. Parce que Perl supporte utilement un sous-ensemble de la technologie sed vous pourriez probablement convertir un simple sed script à Perl pour pouvoir utiliser une fonctionnalité utile de ce dialecte regex étendu, comme les assertions négatives :

perl -pe 's/(?:(?!str).)+/not/' file

remplacera une chaîne qui n'est pas str avec not . Le site (?:...) est un groupe non capturant (contrairement à ce qui se passe dans de nombreuses sed une parenthèse non encodée est un métacaractère en Perl) et (?!str) est une assertion négative ; le texte immédiatement après cette position dans la chaîne ne doit pas être str pour que l'expression rationnelle corresponde. Le site + répète ce modèle jusqu'à ce qu'il ne corresponde pas. Remarquez que l'assertion doit être vraie à chaque position dans la correspondance, donc nous correspondons un caractère à la fois avec . (les débutants se trompent souvent et n'affirment par erreur qu'au début d'un motif plus long, qui pourrait cependant correspondre à str quelque part à l'intérieur, ce qui entraîne une "fuite").

2voto

mohamad.wael Points 1

En plus de toutes les réponses fournies, vous pouvez nier une classe de caractères dans sed, en utilisant la notation suivante [^:[C_CLASS]:] par exemple , [^[:blank:]] correspondra à tout ce qui n'est pas considéré comme un caractère d'espacement .

1voto

A Beckler Points 19

D'après ma propre expérience, et le post ci-dessous le confirme, sed ne supporte pas la négation normale des regex utilisant "^". Je ne pense pas que sed dispose d'une méthode de négation directe... mais si vous consultez l'article ci-dessous, vous verrez quelques solutions de contournement. Sed regex et négation de sous-chaînes

0 votes

En quelque sorte ceci fonctionne : echo '<a href="egww">blah</a><a href=" bloge.weg">yeah</a >' | sed 's@href="[^http]@href="http://stackoverflow.com/@g''.

0 votes

Sorties : <a href="http://stackoverflow.com/gww">blah</a><a href=" bloge.weg">yeah</a > (ne correspond qu'à l'url relative)

1 votes

Ceci est incorrect. sed soutient [^...] La négation est parfaite. Peut-être que votre compréhension de cette construction est incomplète, cependant ? La question liée est utile, cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X