2016-12-09 6 views
-1

file = "Wert"Ich kann nicht verstehen, dieses grep Muster

hier ist der Inhalt von Wert:

erste col1 col2 col3

Sekunden col1 col2 col3

drei col1 col2 col3

wollte Ausgabe:

erste col1 col2 col3

drei col1 col2 col3

Bedingung: wir arbeiten mit Variablen nicht mit Dateien direkt. Das Suchmuster sollte auch in einer Variablen gespeichert werden.

Um dieses Ergebnis zu haben, ich mache:

var = zweite

grep -v $ var $ file> $ tmp; mv $ tmp $ file

tmp muss mit einem beliebigen Wert initialisiert werden, um zu arbeiten

Aber ich kam über diese und ich verstehe einfach nicht mehr meine Bash:

grep -v "^ $ {var}" $ file> $ tmp; mv $ temp $ file

Abgesehen von der Tatsache, dass es nicht für mich arbeiten, ich möchte zu verstehen, die Bedeutung oder zumindest was es zu tun ist; vielleicht kann ich es nachher arrangieren.

was bedeutet "^ $ {var}," !! ??

, was ich weiß bisher:

^-> Zeilenanfang

$ -> Zeilenende

^$ ->?

{} -> Spiel genau

, ->?

all diese Symbole zusammen ->?

Irgendeine Idee Leute? ich danke dir sehr.

+1

'$ {}' ist nicht grep syntax überhaupt - innerhalb doppelter Anführungszeichen ist es * shell * -Syntax, die die Shell anweist, sie und ihren Inhalt durch den Wert einer Variablen zu ersetzen. –

+1

'set -x' ist dein Freund, um Befehle zu sehen, wie sie nach dem Abschluss von Erweiterungen ausgeführt werden. Und es gibt eine Menge quotationsbezogener Fehler hier - bedenken Sie, dass Sie Ihr komplettes Skript unter http://shellcheck.net/ ausführen können. –

+2

@achille: Bitte [formatieren Sie Ihren Code richtig] (http://meta.stackexchange.com/a/22189/248777). – mklement0

Antwort

2

Ihr Befehl wird unter Verwendung von doppelten Anführungszeichen, was bedeutet, dass bash wird zunächst mit dem Argument zu spielen.

Im folgenden:

grep −v "^${var}," $file > $tmp;mv $temp $file 

...mit:

var=foo 

... wird bash${var}-foo erweitern, was zu:

grep −v "^foo," $file > $tmp;mv $temp $file 

(? es auch $file erweitern werde, $tmp und $temp(), aber das ist nicht interessant)

+0

Temp ist ein Tippfehler (sollte tmp sein). – achille

0

Um Rogers Antwort hinzuzufügen,

Definieren Sie Ihre Variable zwischen {} innerhalb einer string zeigt an, welcher Teil die Zeichenkette ist und welcher Teil die Variable ist.

Zum Beispiel, wenn Sie es so schreiben:

"^$var," 

bash es auf diese Weise erweitern: „^‚Wert der Variablen mit dem Namen var‘“, die in einem leeren Wert führen würden, da die Variable var und nicht var, gibt dieses Ergebnis: „^“

wenn Sie die geschweifte Klammer statt wie folgen aus:

"^${var}," 

bash wird für eine Variable var aussehen und hängt^am Anfang und einen am th e Ende dieser Wert nach der Expansion "^ 'var Wert',"

so mit

var=foo 

geben würden Sie "^ foo", erhalten als grep Muster

+0

@ mklement0 - meine Entschuldigung – achille

+0

@Roger & Mike - danke, Leute. – achille

+0

Temp ist ein Tippfehler. – achille