2017-10-27 7 views
1

Ich habe ein Bash-Skript, wo ich grep verwende, um zu finden, ob Text (der in einer Variablen gespeichert ist) in einer Datei.Wie man `grep` macht und gleichzeitig Regex benutzt?

found=$(grep "^$line$" "$file") 

Nun mein Problem ist, ich brauche regex verwenden grep. Jedoch enthält line manchmal Text mit Regex-Schlüsselwörtern, z.B. [ was zum Ausfall führt grep: Unmatched [.

Ist es irgendwie möglich, grep nicht den Inhalt von $line als Regex zu interpretieren?

Antwort

6

Sie können das -F-Flag von grep verwenden, um die Muster als feste Strings anstelle von regulären Ausdrücken interpretieren zu lassen.

Zusätzlich , wenn Sie wollen, dass die Muster ganze Zeilen entsprechen (wie von Ihrem ^$line$ Muster impliziert), Sie mit der -x Flagge kombinieren.

So ist der Befehl in Ihrem Beitrag kann geschrieben werden:

found=$(grep -Fx "$line" "$file") 
+0

funktioniert wie ein Charme ... thx – user1810087

-1

Way grep zu sagen, dass die zur Verfügung gestellten Zeichen sind ganz normale Zeichen ist, sie richtig zu entkommen, zum Beispiel:

$ cat file 
this 
[that 
not[ 
$ line=\\[   # escaped to mark [ as an ordinary character 
$ grep "$line" file 
that[ 
[not 
$ line=[is]   # [ is part of a proper regex 
$ grep "$line" file 
this 

So der Schlüssel ist, die Regex-Zeichen zu entkommen:

$ line=[ 
$ echo "${line/[/\\[}" 
\[ 
$ grep "^${line/[/\\[}" file 
[that 

Oder Sie könnten ein wk:

$ line=[that 
$ awk -v s="$line" '$0==s' file 
[that 
+0

Es ist üblich, Kommentar beim Downvoting. –

+0

Ich habe zwar deine Antwort nicht downvolotiert, aber in meinem Fall hilft das nicht, da "line" eine Variable innerhalb des Skripts ist, und ich habe nicht wirklich Kontrolle über den Inhalt. Es wäre also ein Overkill, wenn man jeden möglichen Fall abdeckt ... – user1810087

+0

Nun, es ist Programmieren. Niemand sagte, dass es einfach sei. @janos zeigte einen anderen Weg. –