Frage Bash

  • Ich möchte in einer Datei per Bash eine Variable, inkl nachfolgendem Komma (wenn vorhanden) entfernen. Der Inhalt der Datei sieht wie folgt aus


    SRS_EXCLUDE_S=domain1,domain2,domain3


    domain1 und domain2 haben einen nachfolgendes Komma, domain3 nicht. Die Variable wären z.B. domain1 oder domain2 oder domain3 usw. Mein Problem ist halt dieses nachfolgende Komma. Wie könnte ich das lösen?

  • Code
    SRS_EXCLUDE_S=`echo $SRS_EXCLUDE_S | cut -d',' -f1,3`

    --> domain1,domain3
    ^ Schneidet hier domain2 heraus, indem mit Trennzeichen , nur die Felder 1 und 3 also domain1 und domain3 erhalten bleiben. :D

    WH8000 SE 🥚 20 | WH1000 SE OST22 | WH1000 SE OST23 | WH1000 SE OST24 | WH 🥚🧶🥛🐖 | 🦆 VPS 200 🇺🇦🕊️

    Einmal editiert, zuletzt von Copro () aus folgendem Grund: No Komma no cry

  • Normalerweise verwendet man sed oder perl, wenn man (komplexere) reguläre Ausdrücke in Verbindung mit bash verwenden muss, allerdings kann man sich bei einfachen Dingen auch anders behelfen (das sieht weniger elegant aus, ist aber schneller, da kein externes Hilfsprogramm erforderlich ist):

    Code
    #! /bin/bash
    set -x
    VAR1="domain1,domain2,domain3"
    VAR1="${VAR1/$1,/}"
    VAR1="${VAR1/,$1/}"
    VAR1="${VAR1/$1/}"
    set +x
    echo "VAR1=[${VAR1}]"

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE/edit?usp=sharing

    Einmal editiert, zuletzt von m_ueberall ()

    Gefällt mir 1
  • ganz so einfach ist es leider nicht. ich muss das mal genauer beschreiben. Es gib eine Datei file.conf. Dort ist u.a eine Zeile wie folgt drin


    SRS_EXCLUDE_S=domain.de,domain.com,domain.net ...


    Die Liste ist hinter domain.net nicht zu Ende geht noch wesentlich weiter. Mit einem Bash Script soll wie folgt eine Domain entfernt werden z.B.

    script.sh domain.com

    Das kann auch domain.xyz sein, domain.com ist nur ein Beispiel. Nun soll die Zeile in der conf Datei wie folgt aussehen:


    SRS_EXCLUDE_S=domain.de,domain.net ...


    Das heisst, es wird domain.com inkl dem darauffolgenden Komma entfernt. Soweit kein Problem. Das Problem für mich stellt sich bei der letzten Domain in der Liste, die kein nachfolgendes Komma hat. Da fehlt mir der Lösungsansatz.

  • Code
    d="domain.com"
    echo "SRS_EXCLUDE_S=domain.de,domain.com,domain.net" | sed -e "s/${d},*//" -e "s/,$//"

    1. sed: domain aus ${d} inkl evtl. postfixiges komma löschen

    2. sed: evtl. vorhandenes zeilenend-komma löschen

    »Hauptsache BogoMIPS!«

    Fleischfresser

    Einmal editiert, zuletzt von Olivetti ()

  • Hille: Mein vorheriges Script demonstriert doch, wie man einen beliebigen String löscht – somit muss das nur eine Schleife gepackt werden, welche eine Datei Zeile für Zeile bearbeitet (und das Ersetzen von / durch // gewährleistet die Ersetzung mehrerer Vorkommen in einer Zeile):

    Code: strip.sh
    #! /bin/bash
    while IFS="" read -r LINE || [[ -n "${LINE}" ]]; do
        LINE="${LINE//$1,/}"
        LINE="${LINE//,$1/}"
        LINE="${LINE//$1/}"
        printf '%s\n' "${LINE}"
    done < $2

    Syntax ist strip.sh <Domäne> <Datei>.

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE/edit?usp=sharing

  • Code
    d="domain.com"
    echo "SRS_EXCLUDE_S=domain.de,domain.com,domain.net" | sed -e "s/${d},*//" -e "s/,$//"


    So passt es, vielen Dank!
    @m_ueberall so recht verstehe ich deinen Lösungsansatz mit der Schleife immer noch nicht. In der Datei gibt es zwar mehrere Zeilen, aber die Domainauflistung steht nur in eine Zeile. Wofür die while Schleife?

    @aRaphael Nein, am Ende darf kein Komma erscheinen. Mein Problem war halt abzufragen, ob ein nachfolgendes Komma im Domainnamen vorhanden ist oder nicht bzw dieses bei Vorhandensein mit zu löschen.

  • while read line schleifen machst du halt, um alle Zeilen abzuklappern.

    Mein Beispiel mit Echo ist ja auch nur ein Ansatz, weil wir die tatsächlichen Inhalte der Datei nicht kennen bzw. nicht wissen, wie es weitergehen soll.


    Mit 'sed -i' kannst du die Datei ja auch gleich umschreiben oder vorher nach 'SRS_EXCLUDE_S' grep-pipen lassen.

    »Hauptsache BogoMIPS!«

    Fleischfresser

    2 Mal editiert, zuletzt von Olivetti ()

    Gefällt mir 1
  • Mein Beispiel mit Echo ist ja auch nur ein Ansatz, weil wir die tatsächlichen Inhalte der Datei nicht kennen bzw. nicht wissen, wie es weitergehen soll.


    Mit 'sed -i' kannst du die Datei ja auch gleich umschreiben oder vorher nach 'SRS_EXCLUDE_S' grep-pipen lassen.


    stimmt, war auch nicht ganz so einfach mein Problem genau zu beschreiben. Im Endeffekt ist eine Schleife aber nicht notwendig. Ja, sed -i, das habe ich im Endeffekt auch gleich so gelöst. Dein Ansatz hat mir weitergeholfen.

  • Bei dieser Art von Problemen (Separator zwischen Feldern) ist es ein gängiger Ansatz das Seperatorzeichen einfach temporär zusätzlich hinten (oder vorne) anzuhängen, damit man den Algorithmus konsistent auf den ganzen String anwenden kann.