Meg akarom keresni azokat a sorokat, amelyek a következő karakterek bármelyikét tartalmazzák:

: / / ? # [ ] @ ! $ & " ( ) * + , ; = %

Válasz

grep "[]:/?#@\!\$&"()*+,;=%[]" 

Zárójeles kifejezésen belül, [...], nagyon kevés karakter van ” special ” (csak nagyon kicsi részhalmaz, például ], - és ^, valamint a három kombináció [=, [: és [.). Ha az ] fájlt belefoglalja a [...] be, akkor a ] -nek kell lennie elsőnek (esetleg egy ^). Úgy döntöttem, hogy a ] -t helyezem először, a [ szimmetria érdekében pedig utoljára.

Az egyetlen dolog, amire emlékezni kell: hogy egyetlen idézett karakterlánc nem tartalmazhat egyetlen idézetet, ezért kettős idézőjelet használunk a kifejezés körül. Mivel kétszeresen idézett karakterláncot használunk, a héj körbe fog piszkálni a dolgok kibővüléséhez. Emiatt elkerüljük a $ -t \$ néven, ami a héj szó szerinti $ -től grep, és elkerüljük a ! -t, mivel \! is, mivel a történelem kibővítés a bash fájlban (bár csak interaktív bash héjakban).

Szeretne visszahúzót felvinni a beállítva, akkor meg kell kerülnie \\ néven, hogy a héj egyetlen hátlapot adjon a grep címre. Ezenkívül, ha be akarja foglalni egy backtick `, akkor azt is meg kell kerülni \` néven, mivel egyébként elindítja a parancscserét.

A parancs a fenti kivonna minden olyan sort, amely legalább egy karaktert tartalmazott a zárójeles kifejezésben.


Egyetlen idézett karakterlánc használata kettős idézett karakterlánc helyett, amely megkerüli a legtöbb bosszúságot milyen karaktereket értelmez a héj:

grep "[]:/?#@!$&"""""()*+,;=%[]" 

Itt az egyetlen dologra kell emlékezni, az ], az az, hogy egyetlen idézett karaktersorozat nem tartalmazhat egyetlen idézetet, ezért ehelyett három karakterlánc összefűzését használjuk:

  1. "[]:/?#@!$&"
  2. """
  3. "()*+,;=%[]"

Egy másik megközelítés a [[:punct:]] POSIX karakterosztály használata. Ez megegyezik a !"#$%&"()*+,-./:;<=>?@[\]^_`{|}~ halmaz egyetlen karakterével, amely nagyobb halmaz, mint a kérdésben megadott (ezen felül tartalmaz még "-.<>^_`{|}~), de a POSIX által definiált összes ” írásjel “.

LC_ALL=C grep "[[:punct:]]" 

Megjegyzések

  • @ilkkachu nem láttam ‘ a $ ott! Köszönöm!
  • Amikor megpróbálom végrehajtani a parancsot, ezt a hibát kapom bash: !\: event not found.
  • @ user9371654 Darn bash! 🙂 Menekülj a ! elől is … Nem vagy bash felhasználó, erről megfeledkeztem. Frissíteni fogom …
  • "[\!]" kibővül [\!] akkor is, ha az előzménybővítés engedélyezve van, így egyezhetne a visszavonással is. ‘ Önnek egyetlen idézőjelre van szüksége, vagy a \! outsi használatával de idézetek.
  • Ne feledje, hogy ‘ nemcsak bash, zsh is megvan az a bosszantó tulajdonsága, amelyet a csh-től örököltek. a csh-ben ! speciális belül '...' is, és ha nem interaktív. Ugyanakkor a csh fájlban (ellentétben a bash-val vagy a zsh-vel) itt a "\!" használata működne (a visszavonás eltávolításra kerül).

Válasz

Használhatja a [:punct:] karakterosztályt, ha ne feledje, hogy más írásjelekkel és speciális karakterekkel is megfelel:

grep "[[:punct:]]" file 

Megjegyzések

  • A A punct karakterosztály (nem makró) megfelel a !"#$%&'()*+,-./:;<=>?@[\]^_ {|} ~ `kifejezésnek a C területi beállításban, ami kissé nagyobb karakterkészlet, mint amit a felhasználó birtokol, de lehet, hogy elég jó.

Válasz

A teljes regex segítségével megtalálhatja speciális karakterek szögletes zárójelben, ha olyan karaktert keres, amely különleges karakter. A reguláris kifejezés gyakorlásának, megtanulásának és ellenőrzésének nagyszerű forrása a regex101.com .

Ez Perl reguláris kifejezéseket használ, amelyeket a GNU grep-kel együtt használhatunk a -P opcióval:

grep -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])" ^^^ 

Ne feledje, hogy két visszalépés szükséges hamvakat a dollárjel előtt, mivel a héjban különleges jelentése van, és az első visszavágás el fogja kerülni a héj számára. (Csak egy hátbillentyűvel a héj eltávolítaná a hátlapot, grep egy lezáratlan dollárjelet látna, ami a sor végét jelentené, és illeszkedne bármelyik bemeneti sorhoz.)

Ha a terminál támogatja a színeket, dobja be a színeket is,

grep --color=auto -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])" 

Itt van a regex101.com

/(\:|\/|\?|\#|\@|\!|\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])/gm 1st Capturing Group (\:|\/|\?|\#|\@|\!|\$|\&|\"|\(|\)|\*|\+|\,|\;|\=|\%|\[|\]) \: matches the character : literally (case sensitive) \/ matches the character / literally (case sensitive) \? matches the character ? literally (case sensitive) \# matches the character # literally (case sensitive) \@ matches the character @ literally (case sensitive) \! matches the character ! literally (case sensitive) \$ matches the character $ literally (case sensitive) \& matches the character & literally (case sensitive) \" matches the character " literally (case sensitive) \( matches the character ( literally (case sensitive) \) matches the character ) literally (case sensitive) \* matches the character * literally (case sensitive) \+ matches the character + literally (case sensitive) \, matches the character , literally (case sensitive) \; matches the character ; literally (case sensitive) \= matches the character = literally (case sensitive) \% matches the character % literally (case sensitive) \[ matches the character [ literally (case sensitive) \] matches the character ] literally (case sensitive) 

megjegyzések

  • nem, a standard ERE használatával ‘ nem kerülheti el a zárást ] visszavonással. a hátsó perjel nem speciális zárójeles kifejezések. Ahhoz, hogy egy ] legyen egy zárójeles kifejezésen belül, elsőnek kell lennie: []other], nem [ot\]her]. Ez ‘ különbözik azoktól a PCRE-ktől, amelyeket alapértelmezés szerint a regex101 ír le.
  • Ez a pcregrep vagy a GNU grep -P. Bizonyos értelemben a Perl-viselkedés egyszerűbb: a visszavágás mindig normálissá teszi a speciális karaktereket.
  • -P-re javítva, sajnálom, összekeverem az -E és -P

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük