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 x
alors 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