2016-06-25 18 views
-1

ich alle Texte in einer Datei mit grep suchen möge, die Symbole (nicht alphanumerisch) und beginnt mit einer Zahl enthalten und welche Räume zwischen ihnengrep für ein bestimmtes Muster

grep -i "^[0-9]\|[^a-zA-Z0-9]\| " 

ich geschrieben habe, die Nach grep Befehl, der perfekt funktioniert, aber ich möchte auch die Texte, die nicht in einer bestimmten Grenze sind sagen, zum Beispiel all jene Texte, die weniger als 3 und mehr als 15 sein sollten greped Wie kann diese Grenze Muster auch in ein Befehl

Ich versuchte mit

{3,15} 

und alles, konnte aber nicht die gewünschte Ausgabe

sample input 
aa 
9dsa 
abcd 
abc#$ 
ab d 

Sample output 
aa    //because length less than 3 
ab d    //because has space in between 
9dsa    // because starts with a number 
abc#$   //because has special symbols in it 
+0

Bitte fügen Sie Beispieleingabe und Ihre gewünschte Ausgabe für diese Beispieleingabe zu Ihrer Frage hinzu. – Cyrus

+0

Was meinen Sie mit 'contain symbols'? Wie in nicht alphanumerischen? – Vikhram

+0

@Cyrus fertig !! Ich habe sie hinzugefügt – slash

Antwort

2

Aus Gründen der Klarheit simplicty, Robustheit, Portabilität, usw. verwenden nur awk statt grep für nicht-triviale Bedingungen zu suchen:

$ awk 'length()<3 || length()>15 || /[^[:alnum:]]/ || /[[:space:]]/ || /^[0-9]/' file 
aa 
9dsa 
abc#$ 
ab d 

ich meine, im ernst, dass nicht viel klarer bekommen konnte/einfacher und es wird in jedem POSIX-awk arbeiten und es Es ist trivial, wenn sich die Anforderungen ändern.

1

Unten Ausdruck erhalten, sollten Sie die erforderlichen Zeilen zu finden. Ich gehe davon aus Sie grep -E so der Wechsel richtig

^[[:digit:]]|[@#$%^&*()]|^.{0,3}$|^.{15,}$ 

Im Folgenden arbeiten verwenden wird, ist die Erklärung für die regex

^[[:digit:]] - Match a line that starts with a number 
[@#$%^&*()]  - Match a line containing the specified symbols. 
        Alternatively you can use [^[:alnum:]], if you want 
        the symbol to match any non alpha numeric character. 
        Beware that a space, underscore, tab, quote, etc are all 
        examples of non alpha numeric characters 
^.{0,3}$  - Match a line containing less than 3 characters 
^.{15,}$  - Match a line containing more than 15 characters 
+0

Sie benötigen GNU awk für '\ d'. Versuchen Sie nicht, nicht-alphanumerische Zeichen aufzulisten (Ihnen fehlen viele!), Negieren Sie einfach die POSIX-Zeichenklasse '[: alnum:]'. –

+0

@ EdMorton Sie haben Recht. Die Antwort wurde korrigiert – Vikhram

Verwandte Themen