it-swarm.com.de

Fehler beim Abgleichen des Zeilenendes mit dem Befehl $ in Sed

Ich wende derzeit den folgenden Befehl in csh über ein Shell-Skript an.

sed -i "s/cb $i$/cb $i $cb/" */callback_events

Wo:

  • $i - Wert der Variablen i
  • $cb - Wert der Variablen cb
  • $ - Zum Anpassen des Zeilenendes

Ich erhalte jedoch den folgenden Fehler mit dem obigen Befehl.

Variable name must contain alphanumeric characters.

Meine aktuelle Shell ist /bin/csh.

1
Karan Shah

Sie müssen das Zeichen $ wenn es in doppelten Anführungszeichen für sich selbst stehen soll; Andernfalls geht die Shell davon aus, dass sie eine Variablenerweiterung einführt, und ist unglücklich, wenn das Zeichen danach nicht alphabetisch ist oder eine der Sondervariablen ist.

sed -i "s/cb $i\$/cb $i $cb/" */callback_events

Hier gibt es zwei Ebenen der Zeicheninterpretation.

  1. Zuerst liest die Shell den Befehl und wendet seine Regeln an. Eine der Regeln ist, dass in Anführungszeichen $ führt eine variable Erweiterung ein, sofern nicht anders angegeben.

  2. Nach Beendigung der Shell sieht der Befehl folgendermaßen aus:

    sed -i s/cd <value-of-i>$/cd <value-of-i> <value-of-cb/ dir1/callback_events dir2/callback_events...
    

    Beachten Sie, dass die Anführungszeichen weg sind, $i und $cb werden durch ihre Werte ersetzt, und \$ wurde nur $. Ebenfalls */callback_events wurde durch eine Liste von Dateien ersetzt.

  3. Dies wird dann an sed übergeben, das its rules anwendet. Eine dieser Regeln ist, dass ein $ am Ende des Suchmusters bedeutet Zeilenende.

4
AlexP

Ich benutze Ubuntu Studio 18 Der $ -Fehler ist auf "Bash-Erweiterung" zurückzuführen. Beachten Sie die Fehler, wenn Sie $ 0 vs $ (0) vs "$ 0" ausführen.

Eine Alternative zum Suchen nach dem Zeilenende in sed-Skript ist alles finden und die & -Variable verwenden, um Dinge danach anzuhängen; Es wird so verwendet:

echo "this was here" | sed -e 's_.*_& YOURFOOBAR_'

Wenn Sie sed script lernen, können Sie versuchen, mit ^ Wie eine Home-Taste zu beginnen und mehrere sed-Befehle mit ; Zeichen hinzuzufügen. Hier verwende ich '_' oder '/' synonym für das /// des ersetzenden sed-Skriptbefehls.

echo "this was here" | sed -e 's/^/PREFIXEDTEXT /;s_.*_& SUFFIXEDTEXT_'

ANMERKUNG: Der Testbefehl hat einen Alias-Wert wie "so alias". siehe man bash Dinge wie & | arbeite nicht.

Zuletzt schlage ich vor, ein Buch bei ebay zu kaufen, anstatt hier zu lernen.

1
openInvent