[Gelöst!] Variablen aus shell-script an sed übergeben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
pixelpirat
Beiträge: 158
Registriert: 05.07.2007 17:22:21

[Gelöst!] Variablen aus shell-script an sed übergeben

Beitrag von pixelpirat » 22.11.2020 13:12:17

Hallo,

Ich muss in mehreren Datenbanken IP-Adressen austauschen. Sie liegen in verschiedenen Tabellen und haben auch unterschiedliche Bezeichnungen.
Daher habe ich den Plan mit mysqdump --add-drop-database --all-databases > dump.sql alles zu ziehen und mit sed zu arbeiten.
Mein script sieht derzeit so aus.

Code: Alles auswählen


AlteIP=(
        '62.211.145.201'
        '2a02:c307:3005:738::1'
        '2a02:c307:3005:738::2'
        '2a02:c307:3005:738::3'
        )

NeueIP=(
        5.119.181.55
        '2a02:c307:3003:312::1'
        '2a02:c307:3003:312::2'
        '2a02:c307:3003:312::3'
        '2a02:c307:3003:738::4'
        )

for i in "${!AlteIP[@]}"
do
        export AlteIP="${AlteIP[i]}"
        export NeueIP="${NeueIP[i]}"
        echo "sed -i s/$AlteIP/$NeueIP/g Dump_all.sql > new_dump_all.sql"
        sed 's/$AlteIP/$NeueIP/g' Dump_all.sql > Dump_all_new.sql
done
In der Echo-Ausgabe sieht es perfekt aus. Leider will sed nicht so.
Ich habe auch schon verschieden Varianten ausprobiert mit ` und auch "${NeueIP}" direkt in der sed Befehlszeile etc. Zuerst auch ohne die "export ... " Zeilen. Nichts hat bisher funktioniert.

Ich weiß nicht mehr weiter und hoffe auf eine (zündene) Idee von Euch!
Danke im voraus.
Zuletzt geändert von pixelpirat am 24.11.2020 08:38:27, insgesamt 1-mal geändert.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Variablen aus shell-script an sed übergeben

Beitrag von tobo » 22.11.2020 13:44:56

Entweder in " einschließen oder das '-Quoting unterbrechen:

Code: Alles auswählen

sed "s/$AlteIP/$NeueIP/g" Dump_all.sql > Dump_all_new.sql
##oder
sed 's/'"$AlteIP"'/'"$NeueIP"'/g' Dump_all.sql > Dump_all_new.sql

pixelpirat
Beiträge: 158
Registriert: 05.07.2007 17:22:21

Re: Variablen aus shell-script an sed übergeben

Beitrag von pixelpirat » 22.11.2020 17:45:28

danke für den Hinweis. Jezt klappts!

Das ganze Script habe ich ein wenig erweitert. Ich stelle es hier mal rein. Vielleicht hat jemand bedarf.
Das ist jetzt die überarbeitet Version, dank der Unterstützung von JTH

Code: Alles auswählen

#!/bin/bash
## -----------------------------------------------------------------------
##      Copyright file="searchReplace.sh"
##      Author: Ralf D. Schmidt (NetOldie)
##      Copyright (c) Ralf D. Schmidt. All rights reserved.
##-----------------------------------------------------------------------
##
## Multiples Suchen & Ersetzen von in Dateien in einem durchgang



file='sy nc.log'

[ ! -f "$file" ] && echo "$file existiert nicht." && exit


# Zu jedem Suchbegriff muss ein Inhalt zum ersetzen vorhanden sein.
# Soll ein gesuchter Inhalt nicht ersetzt werden, so ist eine Leerzeile im ReplaceArray einzufügen.
# Beispiel Suchbegriff-3 soll nicht ersetzt werden

SearchArray=(
        'php7.4'
        'Suchbegriff-2'
        'Suchbegriff-3'
        'Suchbegriff-4'
        )

ReplaceArray=(
        'php7.5'
        'ersetze Begriff-2'
        ''
        'ersetze Begriff-4'
        )

echo -e "\nSuche & Ersetze - Vorschau: Bearbeitete Datei: $file\n"

for i in "${!SearchArray[@]}"
do
        echo -e 'Anzahl des Suchbegriffes '${SearchArray[i]}': '$( grep -c "${SearchArray[i]}" "$file" ) 'Treffer'
        if [ -n "${ReplaceArray[i]}" ]; then
                echo -e "Wird mit Inhalt ersetzt: ${ReplaceArray[i]} \n"
        else
                echo -e 'Suchbegriff '${SearchArray[i]}' wird aus dem '$file' gelöscht!\n'
        fi
done

read -p "Soll der Prozess gestartet werden? [j/N]  "  start

if [[ ! $start == [jJyY] ]]; then
        echo "Abbruch! Suchen & Ersetzen wurde nicht durchgeführt"
        exit 1
fi

echo -e '\nSuchen & Ersetzen wird gestartet.'

for i in "${!SearchArray[@]}"
do
        if [ -n "${ReplaceArray[i]}" ]; then
                echo "${SearchArray[i]} wird mit ${ReplaceArray[i]} ersetzt"
        else
                echo "Suchbegriff '${SearchArray[i]}' wird gelöscht!"
        fi
        sed -i "s/${SearchArray[i]}/${ReplaceArray[i]}/g" "$file"
done

echo -e '\n\nNeuer Stand nach dem Durchlauf:'

for i in "${!SearchArray[@]}"
do
        if [ -n "${ReplaceArray[i]}" ]; then
                echo -e 'Der Suchbegriff '${SearchArray[i]}' wurde ersetzt: '$( grep -c "${ReplaceArray[i]}" "$file" ) 'mal'
                echo -e "Neuer Inhalt: ${ReplaceArray[i]} \n"
        else
                echo -e 'Suchbegriff '${SearchArray[i]}' wurde aus dem '$file' gelöscht!\n'
        fi
done


echo -e "Suchen & Ersetzen erfolgeich abgeschlossen!\n\n"

Zuletzt geändert von pixelpirat am 23.11.2020 08:41:04, insgesamt 2-mal geändert.

JTH
Moderator
Beiträge: 3014
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Variablen aus shell-script an sed übergeben

Beitrag von JTH » 22.11.2020 18:47:16

Wenn du mir ein paar Verbesserungsvorschläge nicht übel nimmst ;)

Das

Code: Alles auswählen

cat $file | grep ${SearchArray[i]} | wc -l
ist so unnötig lang – und bei größeren Datenmengen kann diese Variante auch mal die Geschwindigkeit negativ beeinflussen.

cat um eine einzelne Datei zu „öffnen“ ist in den allermeisten Fällen nicht notwendig. grep – und die allermeisten anderen Werkzeuge – können selbst eine Datei öffnen. Außerdem hat grep eine Option um die Anzahl der Suchtreffer auszugeben. Verkürzt wäre die obige Zeile einfach

Code: Alles auswählen

grep -c ${SearchArray[i]} $file
-c ist kurz für --count.

Außerdem sollte man an dieser Stelle sowohl das Suchmuster als auch den Dateinamen in " " verpacken. Dein Search- und ReplaceArray enthält Einträge mit Leerzeichen (auch wenn vermutlich nur Beispiel)

Code: Alles auswählen

'ersetzt Suchbegriff-2'
Die würden ohne " " den grep-Aufruf kaputt machen. Sicher ist

Code: Alles auswählen

grep -c "${SearchArray[i]}" "$file"
grep -c "${ReplaceArray[i]}" "$file"

Das gleiche beim Dateinamen, der sed übergeben wird. Sicher ist sicher, man wundert sich sonst erst später, warum irgendetwas sehr unerwartet kaputt geht:

Code: Alles auswählen

sed -i "s/${SearchArray[i]}/${ReplaceArray[i]}/g" "$file"

Debianshellcheck ist hilfreich um solche versteckten Fallen zu finden, die einem erst später auf die Füße fallen.
Manchmal bekannt als Just (another) Terminal Hacker.

pixelpirat
Beiträge: 158
Registriert: 05.07.2007 17:22:21

Re: Variablen aus shell-script an sed übergeben

Beitrag von pixelpirat » 22.11.2020 20:15:08

WOW! Ich bin beeindruckt! :hail:

Das ist mein 3. oder 4. Shellscript. Das ist ohne C&P gemacht habe. Da freue ich mich über jeden Hinweis etwas zu verbessern.

Das werde ich direkt mal einarbeiten. Danke! :THX:

Antworten