2016-04-09 4 views
3
enthält

Ich möchte überprüfen, ob eine Zeichenfolge in eine andere Zeichenfolge eingebettet ist. Zum Beispiel pineapple und apple passen ebenso zusammen wie aepprestlse und apple.Überprüfen, ob der String eine eingebettete Zeichenfolge in der Reihenfolge

Dies ist eine einfache Aufgabe, wenn ich das Wort, das ich gegen zum Beispiel testen will wissen:

if [[ $e == *"a"*"p"*"p"*"l"*"e"* ]] 
then 
    echo "match" 
fi 

Jedoch habe ich, was meine "apple" Variable ersetzt nicht die Länge oder Inhalt wissen, wann ich das Skript ausführen . Wie kann ich diese Prüfung mit variablen Größen/Inhalten durchführen?

Antwort

1

Hier ist, wie Sie ein glob Muster Übereinstimmen erzeugen:

data='bcdaeppr?estlse' 
search='app?le' 

# generate a regex using sed i.e. *\a*\p*\p*\?\l*\e* 
patt="*$(sed 's/./\\&*/g' <<< "$search")" 

# now match it 
[[ $data == $patt ]] && echo "matched" || echo "nope" 
matched 

# not matching example 
data='bcdaepprestlse' 
[[ $data == $patt ]] && echo "matched" || echo "nope" 
nope 
+1

danke, ich landete einen verdummte Ansatzes, da ich nicht vor mit Falz gearbeitet habe, aber das hat ich begonnen –

+1

Sie können den gleichen Regex mit 'sed 's /./ &.*/g; s /\.\*$//' <<< apple' erstellen – karakfa

+1

Dies ist in Ordnung, wenn die Suchzeichenfolge einen eingeschränkten Satz von Zeichen enthält, aber es kann brechen unter bestimmten Umständen. Leerzeichen in der Suchzeichenfolge werden ignoriert. Globbing wird an den Suchstring-Zeichen vorgenommen, so dass seltsame Dinge passieren, wenn der Suchstring ein '*' enthält. Seltsame Dinge können auch passieren, wenn der Suchstring Regex-Metazeichen wie '.',' ['und'] 'enthält. – pjh

1

awk zur Rettung!

$ awk -v s='pineapple' -v r='apple' ' 
    BEGIN{for(i=1;i<=length(r);i++) 
      {s=substr(s,k); 
       k=index(s,substr(r,i,1)); 
       if(k==0) exit 1} 
      exit 0}'; echo $? 
Verwandte Themen