In einenm Skript habe ich eine while-read-Schleife eingebaut, welche Daten aus einer csv-Liste einliest. Eines der Felder enthält reguläre Ausdrücke, welche per egrep abgearbeitet werden sollen.
1 2 3 4 5 6 7 8 | while read rec do readarray -d\; -t ax < <(echo $rec) ... egrep -v "$(echo ${ax[3]})" ${ax[2]} ... done << eol ... |
Das dritte Feld enthält also den Dateinamen, das vierte den regulären Ausdruck. Nachfolgend ein kleines Demoskript, um zu zeigen, worin die Schwierigkeit besteht:
1 2 3 4 5 6 7 8 9 10 11 12 | #!/bin/bash echo while read "rec" do echo "Der Record in Rohform: ""$rec" readarray -d\; -t ax < <(echo "$rec") echo "Mit eckigen Klammern: ""${ax[0]}" echo "Mit einem Backslash: ""${ax[1]}" echo "Mit zwei Backslashes: ""${ax[2]}" done << eol [(][1-3][.];\([1-3]\.;\\([1-3]\\. eol |
Ergebnis:
1 2 3 4 | Der Record in Rohform: [(][1-3][.];([1-3].;([1-3]. Mit eckigen Klammern: [(][1-3][.] Mit einem Backslash: ([1-3]. Mit zwei Backslashes: ([1-3]. |
Die Lösung mit den eckigen Klammern funktioniert auch im eigentlichen Skript einwandfrei, jedoch würde ich für den regulären Ausdruck auch gern den Backslash verwenden. Außerhalb des Skripts funktioniert es wie erwartet:
1 2 3 4 5 6 7 8 | wxpte@station1:~/Werkstatt$ echo "\." \. wxpte@station1:~/Werkstatt$ wxpte@station1:~/Werkstatt$ test="\." wxpte@station1:~/Werkstatt$ echo "$test" \. wxpte@station1:~/Werkstatt$ |
Weiß jemand, wie man das hinbekommt, dass auch der Backslash verwendet werden kann?