Ich schreibe gerade ein Bash-Skript, das prüfen soll, ob die exakte Zeichenfolge 329,
in vorhanden ist myfile
. Ich habe im Internet gesucht und einige Antworten gefunden, aber ich kann keine -x
Parameter verwenden, da ich mehr Zahlen als 329,
in habe myfile
. Und ohne den -x
Parameter kann ich das Exists
Ergebnis 329
auch mit erhalten, was ich nicht möchte.
Ich habe es versucht;
if grep -xqFe "329," "myfile"; then
echo -e "Exists"
else
echo -e "Not Exists"
fi
Und das Ergebnis war:
Not Exists
Innen myfile
;
329, 2, 57
Wie kann ich das lösen?
Antwort1
Das -x
ist hier nicht relevant. Das bedeutet (von man grep
):
-x, --line-regexp
Select only those matches that exactly match the whole line.
For a regular expression pattern, this is like parenthesizing
the pattern and then surrounding it with ^ and $.
Es ist also nur dann sinnvoll, wenn Sie Zeilen finden möchten, die nichts anderes als die genaue Zeichenfolge enthalten, nach der Sie suchen. Die gewünschte Option ist -w
:
-w, --word-regexp
Select only those lines containing matches that form whole
words. The test is that the matching substring must either be
at the beginning of the line, or preceded by a non-word
constituent character. Similarly, it must be either at the end
of the line or followed by a non-word constituent character.
Word-constituent characters are letters, digits, and the
underscore. This option has no effect if -x is also specified.
Das wird passen, wenn Sie Ihre Zielzeichenfolge als eigenständiges „Wort“ finden, als Zeichenfolge, die von „Nicht-Wort“-Zeichen umgeben ist. Sie brauchen auch das -F
hier nicht, das ist nur nützlich, wenn Ihr Muster Zeichen mit Sonderbedeutungen in regulären Ausdrücken enthält, die Sie wörtlich finden möchten (z. B. *
), und Sie brauchen es -e
überhaupt nicht, das wäre erforderlich, wenn Sie mehr als ein Muster angeben möchten. Sie suchen also nach:
if grep -wq "329," myfile; then
echo "Exists"
else
echo "Does not exist"
fi
Wenn Sie auch eine Übereinstimmung wünschen, wenn die Zahl die letzte in der Zeile ist, also keins ,
dahinter steht, können Sie grep -E
erweiterte reguläre Ausdrücke aktivieren und dann eine Übereinstimmungentwedera 329
gefolgt von einem Komma ( 329,
) oder a 329
am Ende der Zeile ( 329$
). Diese können Sie folgendermaßen kombinieren:
if grep -Ewq "329(,|$)" myfile; then
echo "Exists"
else
echo "Does not exist"
fi
Antwort2
Eine andere Alternative könnte sein:
if cat myfile | tr "," "\n" | grep -xqF "329"; then
echo -e "Exists"
else
echo -e "Not Exists"
fi
Grüße