• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Suchen, Ersetzen von ganzen Zeilen mit einem Suchwort

Hallo Forum,

als erstes: Ich hab jetzt schon gegoogelt und dir Forumsuche genutzt.. Ich weiß, das es hier sicher irgendwo steht aber ich finde es nicht:

Ich soll ein Script schreiben, das dem Nutzer ermöglichen soll, einen Termin, der in einer Datei gespeichert ist zu ändern:

Die Datei sieht ungefähr so aus:
Code:
01.02.05     11:10Uhr      Klaudi treffen
03.05.06      18:00Uhr     Susi treffen
04.06.07      22:30Uhr     Gerit treffen

ich möchte nun, dass der User die Möglichkeit hat, z.B. "04.06.07" oder "Susi treffen" als String einzugeben und dann die komplette Zeile ersetzt wird.
Also soll dann gefragt werden nach Datum, Uhrzeit und Notiz und dieses dann mit der ganzen Zeile vertauscht werden.

Ich kann mir die jeweilige Zeile ausgeben lassen, mit

Code:
fgrep -w $string datei.txt

Zeilen anhängen mit
Code:
 echo "$String1 $String2" >> datei.txt

Hab aber keinen schimmer wie das mit dem Ersetzen gehen soll.
Ich hatte es mit sed ausprobiert, bekomme das aber mit der Syntax nicht auf die Reihe....
 
LinuxOpfer schrieb:
Hab aber keinen schimmer wie das mit dem Ersetzen gehen soll.
Ich hatte es mit sed ausprobiert, bekomme das aber mit der Syntax nicht auf die Reihe....
suchen und ersetzen funktioniert im sed so:
Code:
sed 's/suche/ersetze/g' Eingabedatei.txt > Ausgabedatei.txt
Im Forum ist hierzu schon viel geschrieben worden...
 
Habe gerade nochmal das Forum durchsucht, aber eine Lösung für mein Problem war da nicht dabei....

Den Befehl sed 's/suche/ersetze/g' Eingabedatei.txt > Ausgabedatei.txt kannte ich...

aber
Code:
declare StringSuche = "01.01.05"
declare StringErsetze = "$datum                 $zeit             $memo"
sed 's/$StringSuche/$StringErsetze/g' Eingabedatei.txt > Eingabedatei.txt
funktioniert nicht
 
1.
sed und Eingabe== Ausgabe ist böse. AFAIR geht das mit dem BSD-sed und -i aber beim GNU-sed und -i kommt auch oft Sch**sse raus.

entweder mit perl arbeiten, dann geht das onthefly oder über Temporäre Datei.


2. "01.01.05" ist ein Böser Ausdruck, '.' steht für ein beliebiges Zeichen, d.h. Du willst mit \. arbeiten.
 
LinuxOpfer schrieb:
ich glaub ich lass diese Aufgabe einfach...
Oder du gehst die Probleme einfach an.
Problem Nr. 1 ist doch einfach zu lösen:
Code:
sed 's/$StringSuche/$StringErsetze/g' Eingabedatei.txt > Ausgabedatei.txt
mv Ausgabedatei.txt Eingabedatei.txt

Problem Nr. 2 ist auch schnell gelöst: Im Suchstring steht der Punkt für ein beliebiges Zeichen (also auch "A" oder "b" usw.). Wenn das nicht so sein soll, musst du den Punkt mit Backslash maskieren. Also:
Code:
01\.01\.05
Sodann gibt es noch ein drittes Problem: $StringSuche wird im sed-Aufruf nicht aufgelöst. Das kann man beheben, in dem man sed mit doppelten Hochkommas statt mit einfachen aufruft. Also:
Code:
sed "s/$StringSuche/$StringErsetze/g"
Wobei man hier wieder aufpassen muss, dass weder in Suche noch in Ersetze ein slash vorkommt...
 
Das wäre mein "Rohvorschlag". Sonderzeichensupprt wäre noch einzubauen.

Code:
FILE=xxxx
STRING="yyy"
grep -w -n "$STRING"  $FILE | head -1 | tr ":" " " | while read zeile rest
do
        read -p "Datum:" datum </dev/tty
        read -p "Zeit:" zeit </dev/tty
        read -p "Was:" was </dev/tty
        cat $FILE | sed "${zeile}s/^.*$/$datum $zeit $was/"
done

Haveaniceday
 
Oben