/ / sed: Mon modèle peut-il contenir un caractère «n'est pas»? Comment puis-je dire "n'est pas X"? - regex, sed

sed: Mon modèle peut-il contenir un caractère «n'est pas»? Comment puis-je dire "n'est pas X"? - regex, sed

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

Réponses:

45 pour la réponse № 1
[^x]

C'est une classe de caractères qui accepte n'importe quel caractère sauf x.


7 pour la réponse № 2

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

"su [^ x]" correspondra à "somme" et "soleil" mais pas "su".

Vous pouvez dire à sed not faire correspondre les lignes avec x en utilisant la syntaxe ci-dessous:

sed "/x/! s/su//" file

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


3 pour la réponse № 3

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

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

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

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 Est-ce que rencontre str, alors gardez le reste;

sed "/str/d" file

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

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

va remplacer une chaîne qui n'est pas str avec not. le (?:...) est un groupe non capturant (contrairement à beaucoup de sed dialecte, une parenthèse non échappée est un métacaractère en Perl) et (?!str) est une affirmation négative; le texte immédiatement après cette position dans la chaîne ne doit pas être "t str afin que la regex corresponde. le + répète ce modèle jusqu'à ce qu'il ne corresponde pas. Notez que l’assertion doit être vraie à chaque position du match. Nous faisons donc correspondre un caractère à la fois avec . (les débutants comprennent souvent cela de manière erronée et, à tort, n’affirment par exemple que le début d’un modèle plus long, qui pourrait toutefois correspondre str quelque part à l'intérieur, conduisant à une "fuite").


1 pour la réponse № 4

De ma propre expérience, et le post ci-dessoussed ne prend pas en charge la négation des expressions rationnelles normales avec "^". Je ne pense pas que sed utilise une méthode de négation directe ... mais si vous cochez la case ci-dessous, vous verrez certaines solutions de contournement. Sed regex et négation de sous-chaîne