staging.inyokaproject.org

Datei öffnen, editieren und wieder speichern via Script

Status: Gelöst | Ubuntu-Version: Server 20.04 (Focal Fossa)
Antworten |

uwbeinternational

Avatar von uwbeinternational

Anmeldungsdatum:
20. Dezember 2020

Beiträge: 3

Guten Abend Zusammen

Ich suche mich schon dumm und dämlich und wurde bisher nicht wirklich fündig. Und zwar habe ich vor aus einem Shell/Bash Script eine Datei zu öffnen, darin nach einer zeichenfolge oder ganzen Zeile suchen, diese löschen, durch etwas anderes ersetzen und dann wieder speichern.

Beispiel Datei1:

1. Zeile steht was
2. Zeile steht was
3. Zeile muss ersetzt werden
4. Zeile steht irgendwas

Nach dem Aufruf und Edit müsste alles gleich bleiben ausser Zeile 3:

1. Zeile steht was
2. Zeile steht was
3. Neuer Text in der Zeile 
4. Zeile steht irgendwas

Wie löse ich das am besten? Die zu editierende Datei heisst natürlich Immer gleich (last.ctl)

Gruss Dominic

Bearbeitet von rklm:

Codeblock. Bitte beachte Forum/Syntax und nutzte die Vorschaufunktion!

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

1
2
3
4
5
datei="last.ctl"
suchtext="muss ersetzt werden"
ersatztext="Neuer Text"

sed -i "s#$suchtext#$ersatztext#g" "$datei"

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Typische Aufgabe für sed:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$ cat data 
1. Zeile steht was
2. Zeile steht was
3. Zeile muss ersetzt werden
4. Zeile steht irgendwas
$ sed -i~ '3c\
Neuer Text in der Zeile
' data
$ cat data
1. Zeile steht was
2. Zeile steht was
Neuer Text in der Zeile
4. Zeile steht irgendwas
$ cat data~
1. Zeile steht was
2. Zeile steht was
3. Zeile muss ersetzt werden
4. Zeile steht irgendwas

Wenn Du nach Zeicheketten suchen willst, dann ersetzt Du die "3" durch einen regulären Ausdruck, z.B.

1
2
3
4
5
6
7
8
9
$ mv data~ data
$ sed -i~ '/Zeile muss ersetzt werden/c\
Neuer Text in der Zeile
' data
$ cat data
1. Zeile steht was
2. Zeile steht was
Neuer Text in der Zeile
4. Zeile steht irgendwas

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Oder z.B. so, wenn Du gar nicht genau weißt, was in der betreffenden Zeile steht:

 sed -e '5s/.*/Mein neuer Text/g' test.txt

Dieses ersetzt einfach die fünfte Zeile mit "Mein neuer Text" in der Datei test.txt. Dieses gibt das Ganze erstmal nur im Terminal aus. Wenn Das die Datei direkt bearbeiten soll, musst Du einfach noch zusätzlich die Option -i verwenden.

uwbeinternational

(Themenstarter)
Avatar von uwbeinternational

Anmeldungsdatum:
20. Dezember 2020

Beiträge: 3

Doc_Symbiosis schrieb:

Oder z.B. so, wenn Du gar nicht genau weißt, was in der betreffenden Zeile steht:

 sed -e '5s/.*/Mein neuer Text/g' test.txt

Dieses ersetzt einfach die fünfte Zeile mit "Mein neuer Text" in der Datei test.txt. Dieses gibt das Ganze erstmal nur im Terminal aus. Wenn Das die Datei direkt bearbeiten soll, musst Du einfach noch zusätzlich die Option -i verwenden.

Danke für die Tips! Den Befehl 'sed' kannte ich noch gar nicht. Merk ich mir.

Danke Euch!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Vergiss aber bei den Antworten, die mit einem g am Ende des Sedbefehls aufwarten, das g.

G steht für *global* und das braucht man, wenn man in einer Zeile nicht nur das erste, sondern jedes Vorkommen eines Suchstrings ersetzen will.

Da das Patternmatching per Default gierig ist, wird ein '.*' die ganze Zeile matchen, so dass das g auch nicht schadet - es schadet aber didaktisch, wenn es wie bei einem Cargocult immer verwendet wird, auch wo es nicht nötig ist.

Antworten |