|
cBoLsmUiEc
Anmeldungsdatum: Mai 21, 2010
Beiträge: 8
|

4. Mai 2012 18:37
Nachdem ich es nicht geschafft habe, den Titel kurz und bündig auf den Punkt zu bringen, glaube ich, dass ich mir bei meinem Problem nur selbst im Weg stehe und einfach nur nen Knoten in meinen Gedanken habe... Aber da die Lösung nicht will, frage ich mal: Ich möchte den Inhalt einer Datei auf String xyz überprüfen. Wenn der nicht vorhanden ist, soll in der letzten Zeile der String abcd angehängt werden. Meine bisherigen Operationen habe ich mit sed gemacht. Ich kann damit zwar die letzte Zeile ansteuern und Strings anhängen, ich kann damit auch nach Strings suchen, bzw auch danach ob es sie nicht gibt. Aber wie ich das in Abhängigkeit zueinander mache, weiß ich gerade nicht.
Hat jemand eine Idee? Gruß
cBoLsmUiEc
|
|
redknight
Moderator & Supporter
Anmeldungsdatum: Okt. 30, 2008
Beiträge: 16680
Wohnort: Lorchhausen im schönen Rheingau
|

4. Mai 2012 18:48
| #!/bin/bash
test=
append=
datei=
if ! grep -q "$test" $datei
then
echo "$append" >> $datei
fi
|
oder so. Geht auch mit einer for-Schleife statt datei=
|
|
Vain
Anmeldungsdatum: April 12, 2008
Beiträge: 2242
|

4. Mai 2012 18:51
Servus, vielleicht so: sed '/gubbel/Q1; ${ s/$/ gubbel/; p; Q0 }' bla > bla2 && mv bla2 bla || rm bla2
└──┬─┘ │ │ └─────┬────┘ │ │ └┬┘ └─┬┘ └──────┬─────┘ └────┬───┘
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ └ ... wenn er nicht 0 war,
│ │ │ │ │ │ │ │ │ dann lösche die
│ │ │ │ │ │ │ │ │ temporäre Datei wieder,
│ │ │ │ │ │ │ │ │ denn dann enthielt dein
│ │ │ │ │ │ │ │ │ Original bereits den
│ │ │ │ │ │ │ │ │ gewünschten String.
│ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ └ Das hier wertet den sed-Exit-Code
│ │ │ │ │ │ │ │ aus: War er 0, dann nenne nun die
│ │ │ │ │ │ │ │ temporäre Datei in deine eigentliche
│ │ │ │ │ │ │ │ Eingabedatei um. Aber ...
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ └ Name einer temporären Ausgabedatei.
│ │ │ │ │ │ │
│ │ │ │ │ │ └ Name der Eingabedatei.
│ │ │ │ │ │
│ │ │ │ │ └ ... du dich mit dem Exit-Code 0, also "success" beendest.
│ │ │ │ │
│ │ │ │ └ Gib die Zeile auf jeden Fall noch aus, bevor ...
│ │ │ │
│ │ │ └ Ersetze das Zeilenende mit deinem Wort und einem Leerzeichen -- sprich,
│ │ │ hänge deinen gewünschten String ans Zeilenende an.
│ │ │
│ │ └ Hier kommen wir nur an, wenn dein Suchstring nirgendwo vorkam.
│ │
│ └ Wenn der gefunden wurde, dann beende sed mit dem Exit-Code 1, also "failure".
│ Beachte, dass dieser Test auch in der letzten Zeile ausgeführt wird.
│
└ Dein Suchstring.Besonders schön finde ich die Lösung nicht. Ohne sed ginge es vermutlich einfacher. – edit: Ich hab’ nicht genau genug gelesen, oder? sed ist keine Voraussetzung?
|
|
cBoLsmUiEc
(Themenstarter)
Anmeldungsdatum: Mai 21, 2010
Beiträge: 8
|

4. Mai 2012 18:58
Ach herrje... Ich hab ja vermutet, dass ich es mir zu schwer mache  redknight, deine Lösung funktioniert und ist herrlich einfach, danke dafür! Vain, nein sed war keine Vorraussetzung, aber trotzdem danke für deine Antwort und vor allem für die eindeutige Erklärung, die selbst ich verstanden habe  Gruß
cBoLsmUiEc
|
|
rklm
Moderator & Supporter
Anmeldungsdatum: Okt. 16, 2011
Beiträge: 2225
|

4. Mai 2012 19:38
cBoLsmUiEc schrieb: Ach herrje... Ich hab ja vermutet, dass ich es mir zu schwer mache
Manchmal hat man aber auch einfach ein Brett vor'm Kopf. Geht mir auch so.
redknight, deine Lösung funktioniert und ist herrlich einfach, danke dafür!
Und es geht noch kürzer - sogar mit Quoting:
| datei=x
fgrep -q xyz "$datei" || echo 'abcd' >>"$datei"
|
Ciao robert
|
|
redknight
Moderator & Supporter
Anmeldungsdatum: Okt. 30, 2008
Beiträge: 16680
Wohnort: Lorchhausen im schönen Rheingau
|

4. Mai 2012 19:46
rklm schrieb: Und es geht noch kürzer
Aaaaaaaand the winner is … rklm 
|
|
track
Anmeldungsdatum: Juni 26, 2008
Beiträge: 4788
Wohnort: Wolfen (S-A)
|

4. Mai 2012 21:23
Aber, wo wir einmal bei sed sind, damit geht das aber auch !! Guckstu: sed -i '/xyz/h; ${x; /./{s/.*/abcd/;H};g}' "$datei"
| | | | | | | | |
| | | | | | | | \ hole den Holdspace wieder als aktuelle Zeile
| | | | | | | |
| | | | | | | \ und hänge diese neue Zeile an den Holdspace an (mit Zeilenvorschub)
| | | | | | \ ersetze die ganze Zeile durch "abcd"
| | | | | \ Wenn in der Zeile (aus dem Holdspace) etwas steht, dann:
| | | | \ tausche die aktuelle Zeile mit dem Holdspace und
| | | \ bei der letzten Zeile:
| | |
| | \ speichere die Zeile im Holdspace
| \ Wenn "xyz" in der Zeile vorkommt:
|
\ Ändere die Datei "in place"LG,  track
|
|
rklm
Moderator & Supporter
Anmeldungsdatum: Okt. 16, 2011
Beiträge: 2225
|

5. Mai 2012 12:41
track schrieb: Aber, wo wir einmal bei sed sind, damit geht das aber auch !! 
Aber nicht mit Deinem Skript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | $ datei=x
$ rm "$datei"
$ touch "$datei"
$ ls -l "$datei"
-rw-r--r-- 1 Robert None 0 5. Mai 12:36 x
$ sed -i '/xyz/h; ${x; /./{s/.*/abcd/;H};g}' "$datei"
$ ls -l "$datei"
-rw-r--r-- 1 Robert None 0 5. Mai 12:36 x
$ cat -n "$datei"
$ echo xyz >|"$datei"
$ cat -n "$datei"
1 xyz
$ sed -i '/xyz/h; ${x; /./{s/.*/abcd/;H};g}' "$datei"
$ cat -n "$datei"
1 xyz
2 abcd
$
|
Es sollte doch angehängt werden, wenn der Text nicht gefunden wird. track, einerseits bewundere ich Leute, die so virtuos mit sed umgehen - andererseits stelle ich bei mir fest, dass ich bei solchen Sachen eher zu ruby greife, weil ich das Ergebnis einfach viel lesbarer finde. Im aktuellen Fall finde ich die Lösung mit fgrep und || eleganter - auch wenn die eine leichte Gefahr für eine Race-Condition enthält. Das Risiko besteht allerdings auch, wenn man die Datei zwischendurch nicht schließt, denn es könnte ja ein anderer Prozess reinschreiben. Da hilft dann nur ordenliches Locking. Ciao robert
|
|
track
Anmeldungsdatum: Juni 26, 2008
Beiträge: 4788
Wohnort: Wolfen (S-A)
|

5. Mai 2012 13:23
Oh ! Da hatte ich doch glatt das NICHT überlesen ... (der 2. Ausdruck müsste demnach /^$/{s//abcd/;H};g} heißen) Du hast ja Recht, so richtig gut lesbar ist es nicht, weil viel zu kryptisch. Von daher ist Deine Shell-Variante von gestern 19:38 Uhr schon unbestritten das, was man in der Praxis nehmen wird. Aber das hat mir halt doch in den Fingern gejuckt, es einmal mit sed vorzuführen, einfach, weil man es kann ! LG, track
|
|
cBoLsmUiEc
(Themenstarter)
Anmeldungsdatum: Mai 21, 2010
Beiträge: 8
|

5. Mai 2012 16:37
Danke für all eure Vorschläge. Auch für das Zeigen, dass es mit sed möglich ist  Auch wenn ich gestern zuerst an eine Lösung mit sed gedacht habe, werde ich dies so aber nicht verwenden. Dazu ist sie einfach zu komplex... Momentan habe ich die IF-Abfrage implementiert, vielleicht baue ich das aber noch um, mal sehen... Gruß
cBoLsmUiEc
|
|
rklm
Moderator & Supporter
Anmeldungsdatum: Okt. 16, 2011
Beiträge: 2225
|

5. Mai 2012 20:52
track schrieb: Aber das hat mir halt doch in den Fingern gejuckt, es einmal mit sed vorzuführen, einfach, weil man es kann !
Ich kann das sowas von verstehen!  Ciao robert
|
|
Vain
Anmeldungsdatum: April 12, 2008
Beiträge: 2242
|

5. Mai 2012 21:14
rklm schrieb: track schrieb: Aber das hat mir halt doch in den Fingern gejuckt, es einmal mit sed vorzuführen, einfach, weil man es kann !
Ich kann das sowas von verstehen! 
Ich auch.  Ich finde auch, wir sollten uns hier öfter mal die Freiheit nehmen und alternative Wege aufzeigen, um von Zeit zu Zeit Horizonte zu erweitern. Ist ja immerhin ein „privates“ Forum hier und keine „Dienstleistung“, bei der nur punktgenau ein Ziel erreicht werden muss und dann ist Schluss. Ich zumindest poste jeden Beitrag aus Interesse und Spaß an der Herausforderung, daher finde ich es immer toll, wenn jemand neue Ideen einbringt. Denke, den meisten von euch geht es da auch ähnlich. 
|
|
rklm
Moderator & Supporter
Anmeldungsdatum: Okt. 16, 2011
Beiträge: 2225
|

5. Mai 2012 21:18
Vain schrieb: Ich finde auch, wir sollten uns hier öfter mal die Freiheit nehmen und alternative Wege aufzeigen, um von Zeit zu Zeit Horizonte zu erweitern.
Ich hatte eigentlich den Eindruck, das passiert hier bereits ständig. So unterschiedlich kann die Wahrnehmung sein...
Ist ja immerhin ein „privates“ Forum hier und keine „Dienstleistung“, bei der nur punktgenau ein Ziel erreicht werden muss und dann ist Schluss. Ich zumindest poste jeden Beitrag aus Interesse und Spaß an der Herausforderung, daher finde ich es immer toll, wenn jemand neue Ideen einbringt. Denke, den meisten von euch geht es da auch ähnlich. 
Genau! +1 Ciao robert
|