ubuntuusers.de

Zeile auslesen aus ein bestimmten Absatz einer Datei

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

johnyff

Avatar von johnyff

Anmeldungsdatum:
8. Januar 2007

Beiträge: 1186

Ich möchte ein bestimmte Zeile aus einer Datei in ein bestimmten Absatz lesen. In der Datei gibt es aber meherere Zeilen die mit dem gleichen Wort beginnen.

Ich möchte z.B. die Zeile mit dem Wort "BackgroundAlternate" aus dem Absatz "Colors:Button" auslesen, wie kann ich da vorgehen?

[Colors:Button]
BackgroundAlternate=213,213,213
BackgroundNormal=223,223,223
DecorationFocus=85,85,85
DecorationHover=243,195,0
ForegroundActive=191,92,0
ForegroundInactive=137,137,135
ForegroundLink=19,73,160
ForegroundNegative=166,38,38
ForegroundNeutral=166,166,38
ForegroundNormal=77,77,77
ForegroundPositive=38,166,38
ForegroundVisited=16,59,128

[Colors:Selection]
BackgroundAlternate=59,118,214
BackgroundNormal=48,111,214
DecorationFocus=85,85,85
DecorationHover=243,195,0
ForegroundActive=191,92,0
ForegroundInactive=64,63,62
ForegroundLink=19,73,160
ForegroundNegative=242,114,114
ForegroundNeutral=242,242,114
ForegroundNormal=229,229,229
ForegroundPositive=114,242,114
ForegroundVisited=16,59,128

Bearbeitet von redknight:

Codeblock und so, verwenden von eckigen Klammern ohne escaping wird nicht gehen

svenXY

Avatar von svenXY

Anmeldungsdatum:
22. September 2008

Beiträge: 542

Wohnort: Heidelberg

Hi,

wenn Du code-tags verwendest, haben wir eine Chance, die Struktur der Datei zu erfassen.

Was hast Du selbst schon versucht? Was genau möchtest Du herauslösen/lesen? Wie bestimmst Du, welcher Absatz geparst werden soll?

Und - falls das für Dich eine Rolle spielt - mit welcher Programmiersprache möchtest Du das tun?

Gruss, Sven

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Uhh - das kann man ja gar nicht lesen.

Du solltest das bitte nochmal "bearbeiten" und das Code-Zitat dann in einen Codeblock setzen:
markieren und dann Knöpfchen

Ungültiges Makro

Dieses Makro ist nicht verfügbar

oben.

Grundsätzlich kann man solches spezifische Filtern erreichen, indem man beim Auftreten des passenden Abschnitts-Kopfes einen Schalter setzt, der dann die Zeilensuche freigibt.

Ich selber benutze für sowas meistens awk, und da sähe das dann z. B. so aus:

#! /usr/bin/awk -f

/^\[.*]$/	{		# Alles was mit "[" anfängt und mit "]" endet ist ein Kopf:
	kopf= $0;
	}

/^BackgroundAlternate=/	{
	if( kopf == "[Colors:Button]" ) print $0;
	}

track

johnyff

(Themenstarter)
Avatar von johnyff

Anmeldungsdatum:
8. Januar 2007

Beiträge: 1186

Sorry, für die miserable Formatierung des Beitrags, haben nach dem Abschicken nicht darauf geachtet.

Ich nutze gezwungenermaßen noch einige KDE3 Anwendung unter KDE4, die KDE3 Programme haben leider nicht die gleichen Farben wie die KDe4 Programme. Bis jetzt ändere ich diese für KDE3 in den einzelnen Konfigurationsdatei des jeweiligen Programms. z.B. für kmymoney2

[General]
alternateBackground=243,199,0
background=150,150,150
buttonBackground=230, 230, 230
buttonForeground=000,000,000
foreground=000,000,000
menuForeground=255,255,255
widgetStyle=qtcurve
windowBackground=140,140,140
windowForeground=000,000,000

Mein Vorhaben ist die Farbwerte aus der Datei ~/.kde/share/config/kdeglobals auszulesen und dann in die jeweilige Konfigurationsdatei zu schreiben, damit ich nicht bei jedem ändern des KDE4 Farbschemas dies manuell machen muß.

@track, vielen Dank, das klappt schon mal, aber ich würde das gerne alles in einen Script packen, z.B. etwa so:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14

function farbe1{
#! /usr/bin/awk -f

/^\[.*]$/	{		# Alles was mit "[" anfängt und mit "]" endet ist ein Kopf:
	kopf= $0;
	}

/^BackgroundAlternate=/	{
	if( kopf == "[Colors:Button]" ) print $0;
	}
 }

farbe 1   ~/.kde/share/config/kdeglobals

Ich weiß die Syntax für func ist völlig falsch, das ist nur damit du weißt was ich meine

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

awk ist ja eines von den Programmen die eine Datei zeilenweise lesen, damit irgend etwas machen und dann was ausgeben.

Das müsste man dabei vom Grundgedanken her im Kopf behalten. Aber in dem Rahmen kann man sehr wohl so eine Konfiguration umsetzen. Einfach alles zeilenweise lesen, dann auswerten, anpassen und damit die neue Datei schreiben. Und es wäre auch kein Problem z. B. erst die ~/.kde/share/config/kdeglobals in eine Variable oder ein Array zu lesen, und dann die vorhandenen Konfigurationsdatei, daraus das zu übernehmen was bleiben soll, und den Rest aus dem Array einzusetzen.

Nur, das ist dann schnell ein Skript (auch bei awk) von 50 - 100 Zeilen. Du müsstest Dir dafür also etwas Geduld und Einarbeitung gönnen.
Welche Erfahrung mit Programmieren hast Du bisher eigentlich ?

Sonst könntest Du Dich ja mal vorab hier einlesen: http://www-e.uni-magdeburg.de/urzs/awk/

Aber ich frage mich, ob es da nicht sowieso schon irgend ein Tool gibt, das das halbwegs automatisch macht. Denn sowas wird doch sonst meistens bei einem "update"- Befehl oder so automatisch übernommen. Dann bräuchtest Du ja gar nichts mehr programmieren.

Wenn das nicht geht, kannst Du mir dann mal die ~/.kde/share/config/kdeglobals und so eine KDE3- config-Datei im Anhang posten ?
Dann kann ich mir die mal angucken, ich habe nämlich kein KDE, sondern nur Gnome ...

track

johnyff

(Themenstarter)
Avatar von johnyff

Anmeldungsdatum:
8. Januar 2007

Beiträge: 1186

Ich habe bis auf eine kurze Arbeit mit Autoit sehr wenig Erfahrung und ich komme meitens nur durch Versuch und Fehler zum Ziel.

track schrieb:

Aber ich frage mich, ob es da nicht sowieso schon irgend ein Tool gibt, das das halbwegs automatisch macht. Denn sowas wird doch sonst meistens bei einem "update"- Befehl oder so automatisch übernommen. Dann bräuchtest Du ja gar nichts mehr programmieren.

Leider habe ich noch nichts gefunden

Wenn das nicht geht, kannst Du mir dann mal die ~/.kde/share/config/kdeglobals und eine KDE3- Konfig-Datei im Anhang posten ?
Dann kann ich mir die mal angucken, ich habe nämlich kein KDE, sondern Gnome ...

track

Ich möchte ja nicht alle Farbwerte auslesen, mir reichen diese paar Zeilen für den jeweiligen KDE3 Programm

[General]
alternateBackground=243,199,0
background=150,150,150
buttonBackground=230, 230, 230
buttonForeground=000,000,000
foreground=000,000,000
menuForeground=255,255,255
widgetStyle=qtcurve
windowBackground=140,140,140
windowForeground=000,000,000
kdeglobals (7.7 KiB)
Download kdeglobals
kmymoney2rc (5.1 KiB)
Download kmymoney2rc

Dalai

Avatar von Dalai

Anmeldungsdatum:
16. Juni 2008

Beiträge: 2316

Wohnort: Meiningen

Da das ein INI-Typ ist, würde ich eine dafür geeignete Lib benutzen. Ein

apt-cache search "\.ini"
# bzw.
apt-cache search " ini "

gibt mir unter anderem dies aus:

libconfig-inifiles-perl - Read .ini-style configuration files
libconfig-tiny-perl - Read/Write .ini style files with as little code as possible
libconfig-inihash-perl - Perl extension for reading and writing INI files
python-configobj - a simple but powerful config file reader and writer for Python

Mit Perl und Python geht das also in jedem Fall - leider habe ich davon nicht wirklich Ahnung 😕 (meine Dosis Python hatte ich heute schon 😀).

MfG Dalai

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ok, das ist dann nicht so aufwändig.

In dem Sinne wie ich es vorgeschlagen hatte könnte man da so vorgehen, dass man nur den Abschnitt [General] aus der ~/.kde/share/config/kdeglobals in ein Array einliest und dann die kmymoney2rc zueilenweise durchgeht. Alles was zu einem anderen Abschnitt gehört wird einfach 1:1 gedruckt. Das was unter dem Header [General] steht, wird dann verglichen mit dem Array und durch die Werte daraus ersetzt. Und wenn ein Schlüssel nicht gefunden wird, wird er natürlich auch nicht ersetzt, und es erfolgt am besten eine Fehlermeldung.

Bei dem Array kann man einen Trick verwenden. Es interessieren ja eigentlich die Werte rechts vom "=", also schreibt man nur die in das Array und benutzt den Schlüsselnamen einfach als Index. Dann geht das suchen ganz einfach, man braucht nämlich nur den betreffenden Schlüssel abzufragen.

Ich gucke auch mal, ob ich da was auf die Schnelle basteln kann.

track

johnyff

(Themenstarter)
Avatar von johnyff

Anmeldungsdatum:
8. Januar 2007

Beiträge: 1186

ind der ~/.kde/share/config/kdeglobals gibt es kein Abschnitt für das Farbschema welches mit [General] beginnt, sondern jedes Farbschemabereich hat einen eigenen Abschnitt.

Unten mal ein Beispiel welcher Abschnitt in der ~/.kde/share/config/kdeglobals für welche Farben in einer Programm-Konfigurationsdatei KDE3 steht im Abschnitt "[General]"

Farbenbeispiel für KDE3 Programme

[General]
alternateBackground=239,239,239
background=255,255,255
foreground=6,6,6
buttonBackground=233, 233, 233 
buttonForeground=77,77,77
windowBackground=130,130,130
windowForeground=3,3,3
widgetStyle=qtcurve

Gleiches Farbenbeispiel für KDE4

[Colors:View]
BackgroundAlternate=239,239,239
BackgroundNormal=255,255,255
ForegroundNormal=6,6,6

[Colors:Button]
BackgroundNormal=223,223,223
ForegroundNormal=77,77,77

[Colors:Window]
BackgroundNormal=130,130,130
ForegroundNormal=3,3,3

schon mal vielen Dank für deine Mühen

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

😲

Bei den beiden Dateien die Du mir im Anhang gegeben hast, war sehr wohl in beiden ein Abschnitt [General] dabei, und der ließe sich auch einfach so umsetzen wie ich geschrieben habe. Im Moment verstehe ich nicht ganz den Punkt. Ist da noch etwas anderes zu berücksichtigen ?

Wie hast Du denn bisher das Farbschema angepasst ?

Hast Du nicht einfach alle Schlüssel aus der "kdeglobals" [General] in die "kmymoney2rc" übernommen ? - so hatte ich das nämlich verstanden.
Und genau das würde mein awk-Skript im Anhang auch tun.

track

inifilter (872 Bytes)
Download inifilter

johnyff

(Themenstarter)
Avatar von johnyff

Anmeldungsdatum:
8. Januar 2007

Beiträge: 1186

track schrieb:

Hast Du nicht einfach alle Schlüssel aus der "kdeglobals" [General] in die "kmymoney2rc" übernommen ? - so hatte ich das nämlich verstanden.

track

es gibt in der "kdeglobals" den Abschnitt "[General]", aber der ist nicht für das Farbschema zuständig für KDE4. In KDE4 sind die einzelnen Farbbereiche in der "kdeglobals" nochmal extra unterteilt.

[Colors:Button]
BackgroundAlternate=213,213,213
BackgroundNormal=223,223,223
DecorationFocus=85,85,85
DecorationHover=243,195,0
ForegroundActive=191,92,0
ForegroundInactive=137,137,135
ForegroundLink=19,73,160
ForegroundNegative=166,38,38
ForegroundNeutral=166,166,38
ForegroundNormal=77,77,77
ForegroundPositive=38,166,38
ForegroundVisited=16,59,128

[Colors:Selection]
BackgroundAlternate=59,118,214
BackgroundNormal=48,111,214
DecorationFocus=85,85,85
DecorationHover=243,195,0
ForegroundActive=191,92,0
ForegroundInactive=64,63,62
ForegroundLink=19,73,160
ForegroundNegative=242,114,114
ForegroundNeutral=242,242,114
ForegroundNormal=229,229,229
ForegroundPositive=114,242,114
ForegroundVisited=16,59,128

[Colors:Tooltip]
BackgroundAlternate=59,118,214
BackgroundNormal=48,111,214
DecorationFocus=85,85,85
DecorationHover=243,195,0
ForegroundActive=191,92,0
ForegroundInactive=229,229,229
ForegroundLink=19,73,160
ForegroundNegative=242,114,114
ForegroundNeutral=242,242,114
ForegroundNormal=229,229,229
ForegroundPositive=114,242,114
ForegroundVisited=16,59,128

[Colors:View]
BackgroundAlternate=239,239,239
BackgroundNormal=255,255,255
DecorationFocus=85,85,85
DecorationHover=243,195,0
ForegroundActive=191,92,0
ForegroundInactive=130,130,130
ForegroundLink=19,73,160
ForegroundNegative=130,3,3
ForegroundNeutral=130,130,3
ForegroundNormal=6,6,6
ForegroundPositive=3,130,3
ForegroundVisited=16,59,128

[Colors:Window]
BackgroundAlternate=122,122,122
BackgroundNormal=130,130,130
DecorationFocus=85,85,85
DecorationHover=243,195,0
ForegroundActive=191,92,0
ForegroundInactive=87,87,87
ForegroundLink=19,73,160
ForegroundNegative=129,1,1
ForegroundNeutral=129,129,1
ForegroundNormal=3,3,3
ForegroundPositive=1,129,1
ForegroundVisited=16,59,128

P.S. Aber du bist trotzdem genial, durch deine Fragen bin ich jetzt draufgestoßen, der Bereich "[General]" ist für die KDE3 Programme zuständig. Leider lässt sich dieser Bereich in KDE4 in den Systemeinstellungen nicht verändert, es geht nur über manuelles editieren.

also das Script müsste die Farbeinstellungen aus der "kdeglobals" in den einzelnen Bereichen für KDE4 lesen und dann unter [General] für die KDE3 Programme entsprechend schreiben.

Z.B. liest es folgende Werte aus der "kdeglobals":

[Colors:Window]
BackgroundAlternate=122,122,122
BackgroundNormal=108,108,108
ForegroundNormal=3,3,3

[Colors:Button]
BackgroundNormal=223,223,223
ForegroundNormal=77,77,77

[Colors:View]
BackgroundNormal=254,255,255
ForegroundNormal=6,6,6

und schreibt sie dann so unter "[General]" in der "kdeglobals" so in:

[General]
alternateBackground=239,239,239
background=130,130,130
foreground=3,3,3
buttonBackground=233, 233, 233
buttonForeground=77,77,77
windowBackground=130,130,130
windowForeground=3,3,3

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Um damit etwas sinnvolles anzufangen müsste man also jetzt eine Abbildungstabelle erstellen:

[Colors:Window]BackgroundAlternate  ->  [General]alternateBackground
[Colors:Window]BackgroundNormal  ->  [General]background
...  usw.

und dementsprechend dann beim auftreten der betreffenden Schlüssel die Werte in die passenden Array-Felder laden.

Und schon sind wir bei den prophezeiten 50 - 100 Zeilen Code. 😀

track

johnyff

(Themenstarter)
Avatar von johnyff

Anmeldungsdatum:
8. Januar 2007

Beiträge: 1186

Aber das ich durch deine Fragen auf den Abschniit "[General]" gekommen bin für KDE3 erleichert mir dir Sache schon ungemein.

Das Script bräuchte nur diese 7 Werte auszulesen, mir würde schon reichen, wenn ich ein Beispiel hätte für ein Wert.

[Colors:Window]
BackgroundAlternate=122,122,122
BackgroundNormal=108,108,108
ForegroundNormal=3,3,3

[Colors:Button]
BackgroundNormal=223,223,223
ForegroundNormal=77,77,77

[Colors:View]
BackgroundNormal=254,255,255
ForegroundNormal=6,6,6

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Sprach eigentlich irgendwas gegen Python oder so?

Gewinnt sicher keinen Preis für tollen Stil, zeigt aber die Richtung auf, in die du etwa gehen könntest:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/env python

import ConfigParser

# Lesen.
ini = ConfigParser.SafeConfigParser()
ini.read('hurz.ini')
print ini.get('Colors:Button', 'ForegroundNormal')

# Schreiben.
ini.set('Colors:Button', 'ForegroundNormal', '1,2,3')
ini.write(open('peng.ini', 'w'))

Details dazu siehe hier: http://docs.python.org/library/configparser.html. Mir erscheint's zumindest einfacher/sauberer als das alles manuell zu machen. 😉

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Diese 7 Werte auslesen ist das eine, aber sie an der richtigen Stelle wieder eintragen das andere... 😀

Genau darum hatte ich ja nach der Umschlüsselungstabelle gefragt.

Mit dieser Schlüsselzuweisung habe ich das erstmal in die 2. Fassung meines awk-Skripts eingebaut:

		## In Fassung 2 müssen wir jetzt umschlüsseln:	[Colors:Window]BackgroundAlternate	->  alternateBackground
		##						[Colors:Window]BackgroundNormal		->  background
		##						[Colors:Window]ForegroundNormal		->  foreground
		##						[Colors:Button]BackgroundNormal		->  buttonBackground
		##						[Colors:Button]ForegroundNormal		->  buttonForeground

Preisfrage: habe ich die Zuweisung richtig geraten ?

track

inifilter2 (1.8 KiB)
Download inifilter2
Antworten |