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