ubuntuusers.de

Eine Zeile + die nächste in einer Config-Datei ersetzen mit sed

Status: Gelöst | Ubuntu-Version: Xubuntu 22.04 (Jammy Jellyfish)
Antworten |

Fried-rich

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Hallo,

ich versuche in einer Config-Datei eine Zeile (die eindeutig identifizierbare ist) und die nächste (die doppelt vorkommen kann) per sed zu editieren. Diese lautet

[Directories/Export]
Default=/pfad/zum/ordner

Das Problem ist der Zelenumbruch, der nicht einfach mit

sed -i 's#\n##g' file

ersetzt werden kann. Was geht ist

sed -i '{:q;N;s/\[Directories\/Export\]\nDefault=.*$/\[Directories\/Export\]\nDefault=\/pfad/g;t q}' file

(ich muss aber zugeben, dass ich nicht verstehe wieso). Ich habe das ganze zunächst mit einer einfachen Textdatei versucht die nur die beiden Zeilen enthält, hier geht es. Teste ich das dann an der ganzen cfg geht das nicht. Hab ein paar Versuche gemacht, wenn ich eine bestimmte Zahl an Zeilen über dem zu ersetzen Teil lösche geht es oder nicht. Wenn der Text

[Directories/Export]

auf Zeile 17 oder kleiner steht geht alles, ab Zeile 18 geht nichts.

Kann sich das jemand erklären? Vor allem würde mich interessieren wieso hier ein einfaches Suchen+Ersetzen mit \n nicht geht.

P.S. Laut 'od -c file' ist der Zeilenumbruch '\n' korrekt.

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 838

Wohnort: Hamburg

also, um welche config geht es, dann kann ich das hier mal testen

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Dafür bietet sich tr an.

1
cat foo | tr -d '\n' > foo.neu

Sed arbeitet (normalerweise) zeilenorientiert. Es liest Zeile für Zeile ein, und arbeitet jede für sich ab. Man kann aber mit Puffern jonglieren, um eine Zeile erst bei der nächsten auszugeben.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Die Config von Audacity. Ab Version 3.x gibt es in den Einstellungen die Möglichkeit Standard-Ausgabeordner einzustellen. Man kann aber nicht den Input-Ordner als Ausgabeordner für die Export-Funktion nutzen. Das wurde von den Entwicklern auf Github auch abgelehnt, die Anfrage kam schon.

tr ist keine Option, weil ich ja nicht alle Zeilenumbrüche löschen will (was dein Befehl machen würde) sondern nur eine bestimmte Zeile plus die nächste.

Das mit dem zeilenweisen arbeiten bei sed hab ich inzwischen auch gelesen und die Option 'N' (die ich vorher überhaupt nicht kannte) halbwegs verstanden. Wieso das aber nur geht wenn die Datei klein ist verstehe ich nicht.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

Das geht sicher super effizient mit sed, aber ich bekomme bei so etwas immer einen Knoten im Hirn. Ein Ansatz mit awk:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ cat config 
aaaa
[Directories/Export]
Default=/pfad/zum/ordner
bbb
$ awk '/[Directories\/Export]/{e=1} e&&/^Default/{$0="/a/b/c";e=0}{print}' config 
aaaa
[Directories/Export]
/a/b/c
bbb

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

sed liest Dateien zeilenweise - d.h. man kann nicht nach mehrzeiligen Strings suchen. Was aber geht ist erst nach einer Zeile zu suchen und dann in der nachfolgenden Zeile die Ersetzung durchzuführen:

1
sed '/\[Directories\/Export\]/{ n; s#Default=.*#Default=/pfad/zum/neuen_ordner#g }' test.txt

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Mit awk kenne ich mich überhaupt nicht aus, bei sed verstehe ich zumindest etwas. Mit dem Befehl geht es. Danke.

Antworten |