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:
-
"[]:/?#@!$&"
-
"""
-
"()*+,;=%[]"
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
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 GNUgrep -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
$
ott! Köszönöm!bash: !\: event not found
.bash
! 🙂 Menekülj a!
elől is … Nem vagybash
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.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 acsh
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).