2016-07-15 33 views
0

Ich habe die nächsten zwei Regex in Bash:Überprüfen Sie, ob eine Zeichenfolge „-“ und „]“ zugleich

1.^[-a-zA-Z0-9\,\.\;\:]*$ 
2.^[]a-zA-Z0-9\,\.\;\:]*$ 

Die ersten Spiele, wenn die Zeichenfolge enthält ein „-“ und die anderen Werte . Die zweite enthält ein "]". Ich lege diese Werte am Anfang meiner Regex, weil ich sie nicht scape kann. Wie kann ich die beiden Werte gleichzeitig erreichen?

+0

Für mein Grep scheint es zu funktionieren, wenn man '' 'vor die schließende eckige Klammer' ... \: -] '(des 2.) setzt. –

Antwort

2

Sie können auch die - am der Klammerausdruck Ende setzen, da eine Reihe an beiden Enden geschlossen werden müssen.

^[]a-zA-Z0-9,.;:-]*$ 

Sie müssen auch keines der anderen Zeichen entkommen. Doppelpunkte, Semikolons und Kommas haben in keinem Teil eines regulären Ausdrucks eine besondere Bedeutung, und während ein Punkt seine spezielle Bedeutung in einem Klammerausdruck verliert.

+0

Das würde auch 'aaaa' entsprechen, die keines enthält ']' noch '-' – hek2mgl

+2

So würden beide ursprünglichen regulären Ausdrücke; Ich beantworte nur, wie man sowohl ']' als auch '-' in den gleichen Klammerausdruck einfügt. – chepner

+0

Imo ist die Frage klar. Lies es! :) – hek2mgl

0

Vielleicht kann dies helfen Ihnen

#!/bin/bash 
while read p; do 
echo $p | grep -E '\-.*\]|\].*\-' | grep "^[]a-zA-Z0-9,.;:-]*$" 
done <$1 

user-host:/tmp$ cat test 
-i]string 
]adfadfa- 
string- 
]string 
str]ing 
]123string 
123string- 
????? 
++++++ 


user-host:/tmp$ ./test.sh test 
-i]string 
]adfadfa- 
1

Grundsätzlich können Sie verwenden:

grep -E '^.*\-.*\[|\[.*\-.*$' 

Sie paßt entweder ein - gefolgt von null oder mehr beliebigen Zeichen und ein [ oder ein [ gefolgt von null oder mehr Zeichen und ein -

jedoch seit Sie akzeptieren keine willkürlichen Zeichen, Sie müssen sie ändern in:

grep -E '^[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*\[|\[[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*$' 
0

Es gibt zwei Fragen in Ihrem Beitrag.

  1. Eine davon ist in der Beschreibung:

    Wie ich zur gleichen Zeit bekommen die beiden Werte überein?

    Das ist eine OR Spiel ist, die mit einem Bereich getan werden könnte, dass Ihre beiden Bereiche mischen:

    pattern='^[]a-zA-Z0-9,.;:-]*$' 
    

    , dass eine Linie übereinstimmen, die entweder enthält (oder mehrere) - ... OR ... ] ... OR eines der enthaltenen Zeichen. Das wären alle Zeilen (außer ?????, ++++++ und as df gh) im Testskript unten.

  2. Zwei ist im Titel:

    ... eine Zeichenfolge enthält „-“ und „]“ zugleich

    Das ist eine AND Übereinstimmung vorhanden ist.Die einfachste (und am langsamsten) Weg, es zu tun ist:

    echo "$line" | grep '-' | grep ']' | grep '^[-a-zA-Z0-9,.;:]*$' 
    

    Die ersten beiden Anrufe wählen nur die Linien grep, die:

    enthalten sowohl (eine oder mehr) - und (ein oder mehr) ]

Testskript:

#!/bin/bash 

printlines(){ 
cat <<-\_test_lines_ 
asdfgh 
asdfgh- 
asdfgh] 
as]df 
as,df 
as.df 
as;df 
as:df 
as-df 
as]]]df 
as---df 
asAS]]]DFdf 
as123--456DF 
as,.;:-df 
as-dfg]h 
as]dfg-h 
a]s]d]f]g]h 
a]s]d]f]g]h- 
s-t-r-i-n-g] 
as]df-gh 
123]asdefgh 
123asd-fgh- 
????? 
++++++ 
as df gh 
_test_lines_ 
} 

pattern='^[]a-zA-Z0-9,.;:-]*$' 

printf '%s\n' "Testing the simple pattern of $pattern" 
while read line; do 
    resultgrep="$( echo "$line" | grep "$pattern" )" 
    printf '%13s %-13s\n' "$line" "$resultgrep" 
done < <(printlines) 
echo "#############################################################" 
echo 

p1='-'; p2=']'; p3='^[]a-zA-Z0-9,.;:-]*$' 

printf '%s\n' "Testing a 'grep AND' of '$p1', '$p2' and '$p3'." 
while read line; do 
    resultgrep="$( echo "$line" | grep "$p1" | grep "$p2" | grep "$p3" )" 
    [[ $resultgrep ]] && printf '%13s %-13s\n' "$line" "$resultgrep" 
done < <(printlines) 
echo "#############################################################" 
echo 

printf '%s\n' "Testing an 'AWK AND' of '$p1', '$p2' and '$p3'." 
while read line; do 
    resultawk="$( echo "$line" | 
    awk -v p1="$p1" -v p2="$p2" -v p3="$p3" '$0~p1 && $0~p2 && $0~p3')" 
    [[ $resultawk ]] && printf '%13s %-13s\n' "$line" "$resultawk" 
done < <(printlines) 
echo "#############################################################" 
echo 

printf '%s\n' "Testing a 'bash AND' of '$p1', '$p2' and '$p3'." 
while read line; do 
    rgrep="$( echo "$line" | grep "$p1" | grep "$p2" | grep "$p3" )" 
    [[ ($line =~ $p1) && ($line =~ $p2) && ($line =~ $p3) ]] 
    rbash=${BASH_REMATCH[0]} 
    [[ $rbash ]] && printf '%13s %-13s %-13s\n' "$line" "$rgrep" "$rbash" 
done < <(printlines) 
echo "#############################################################" 
echo 
Verwandte Themen