Sottostringa nella stringa in bash?


0

Qual è l'equivalente dell'istruzione python in bash:

if "mystr" in "a long string with mystring in it":
    print("found string")

L'offset in numero di caratteri NON può essere considerato come costante, quindi non penso di poterlo ottenere cut lavorare.

Risposte:


2

Utilizza la corrispondenza con caratteri jolly. Per bash in particolare:

if [[ $longstring == *mystr* ]]; then

if [[ $longstring == *"my string"* ]]; then

if [[ $longstring == *"$matchstr"* ]]; then

Nel [[ operatore, il lato sinistro è espanso letteralmente (cioè senza la necessità di virgolette), mentre le parti non quotate del lato destro sono trattate come caratteri jolly - fondamentalmente le stesse regole di quotatura di un case dichiarazione.

È anche possibile utilizzare la corrispondenza regex di POSIX:

if [[ $longstring =~ mystr ]]; then

if [[ $longstring =~ "my string" ]]; then

if [[ $longstring =~ "$matchstr" ]]; then

Ancora una volta, le parti citate del lato destro sono abbinate letteralmente mentre le parti non quotate sono abbinate come operatori regex.


Se hai bisogno sh Compatibilità:

case $longstring in
    *mystr*)
        echo yes;;
    *"$matchstr"*)
        echo yes again!;;
    *)
        echo no;;
esac

In alternativa, se stai abusando della lingua:

if case $longstring in
    *mystr*) true;;
    *"$matchstr"*) true;;
    *) false;;
esac; then
    ...
fi

(Questo if / case / esac / then form è effettivamente utile in alcune situazioni, come quando si effettua una whitelist o lista nera incrementale.)

Versione più breve:

if ! case $longstring in *"$matchstr"*) !; esac; then
    echo "It matched!"
fi

Molti script sh usano expr ma non è un built-in di shell, quindi un po 'più lento:

if expr match "$longstring" ".*mystr"; then
    ...
fi

In questo caso (dato che expr non può vedere le differenze nel quoting) l'intero parametro "match" è interpretato come una regex ancorata (come grep ma sempre con un ^ anteporre). Quindi fai attenzione quando passi una variabile come partita.


1

Questo lo farà:

#! /bin/bash

X=`echo "a long string with mystring in it" | grep "mystr" | wc -l`
if [ $X -gt 0 ]
then
        echo "found string";
fi

L'idea è che "echo" imposta la stringa, grep cerca la sottostringa nella stringa passata e wc -l restituisce il numero di righe in cui è stata trovata la stringa - quindi 0 o 1.



Stavo solo lavorando su qualcosa del genere per una risposta più sofisticata - ora ho trovato il seguente 1 liner (che è probabilmente più vicino a quello che volevi): echo "una lunga stringa con mystring in esso" | grep -q "mystr" & amp; & amp; echo "found string" - ma la tua strada è più efficiente.
davidgo

1
ahhhh! grep restituisce 0 se trova la corrispondenza. molto più leggibile
tarabyte

1
Sì, questo significa che puoi semplificarlo if echo ... | grep -q ...; then
grawity

0

Puoi usare bash espansione dei parametri:

if [ "${TestString/$SearchString/}" == "$TestString" ]; then echo Found; fi

o se vuoi un'espressione compatibile con Bourne:

if [ "${TestString#*$SearchString}" == "$TestString" ]; then echo Found; fi

$SearchString può essere un valore letterale: può contenere spazi, sia letterali che variabili, e una variabile può contenere }, ma in un letterale deve essere sfuggito come \}. Nella prima forma, la stessa considerazione vale anche per /.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.