/ / sed: Môže môj vzor obsahovať znak "nie je"? Ako poviem "nie je X"? - regex, sed

sed: Môže môj vzor obsahovať znak "nie je"? Ako poviem "nie je X"? - regex, sed

Ako poviem "nie je" istý znak v sed?

odpovede:

45 pre odpoveď č. 1
[^x]

Toto je trieda znakov, ktorá akceptuje ľubovoľný znak okrem x.


7 pre odpoveď č. 2

Pre tých nie je spokojný s vybranou odpoveďou ako na komentár johnny.

"su [^ x]" bude zodpovedať "súčet" a "slnko", ale nie "su".

Môžete povedať sed do not zhody s riadkami x pomocou syntaxe nižšie:

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

Pozrite si odpoveď kkellera na ďalší príklad.


3 pre odpoveď № 3

Existujú dva možné interpretácie vašej otázky. Ako už poukázali iní, [^x] zodpovedá jedinému znaku, ktorý nie je x, Ale prázdny reťazec tiež nie je x, takže možno hľadáte [^x]|^$.

Žiadna z týchto odpovedí sa nevzťahuje na viacmiestne sekvencie, ktoré sú zvyčajne to, čo ľudia hľadajú. Môžete robiť niečo pekne

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

vytvoriť regulárny výraz, ktorý sa nezhoduje str, ale oveľa jednoduchšie riešenie sed je odstrániť všetky riadky, ktoré robí zápas str, potom držte zvyšok;

sed "/str/d" file

Perl 5 predstavil oveľa bohatší motor regexu, ktorý je preto štandardom v jazyku Java, PHP, Python atď. Pretože Perl pomáha podporovať podmnožinu sed syntax, môžete pravdepodobne previesť jednoduchý sed skript pre Perl, aby sa dostal k použiteľnej funkcii z tohto rozšíreného dialektu regexu, ako napríklad negatívne tvrdenia:

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

nahradí reťazec, ktorý nie je str s not, (?:...) je nezachytávacia skupina (na rozdiel od mnohých sed dialekty, nezaradená závorka je metacharakter v Perl) a (?!str) je negatívne tvrdenie; text bezprostredne po tejto pozícii v reťazci nesmie byť str aby sa regex zhodoval. + opakuje tento vzor, ​​kým sa nezhodí. Všimnite si, ako musí byť toto tvrdenie pravdivé na každej pozícii v zápase, takže sa zhoduje s jedným znakom naraz . (nováčikovia si to často mýlia a mylne tvrdia len na začiatku dlhšieho vzoru, ktorý by sa však mohol zhodovať str niekde vo vnútri, čo vedie k "úniku").


1 pre odpoveď č. 4

Z mojej vlastnej skúsenosti a nižšieho príspevkupodporuje to, sed nepodporuje normálnu negáciu regexu pomocou "^" Nemyslím si, že sed má metódu priamej negácie ... ale ak skontrolujete nižšie uvedený post, uvidíte nejaké riešenie. Negatívne sedgegege a substring negation