Budada_Bubladend
Anmeldungsdatum: 13. Dezember 2009
Beiträge: 812
|
Hallo Leute, ich habe eine Frage zu sed.
Ich komme leider mit Googleergebnissen nicht weiter.
Ich möchte den Inhalt einer Variable an eine bestimmte Zeile anhängen.
Beispiel
var='das um etwas ergänzt wurde'
#Zeile: Dies ist> ein Beispiel >
#hinter dieser Zeile möchte ich den Inhalt aus $var angehängt haben:
Dies ist> ein Beispiel>das um etwas ergänzt wurde
mit sed a/ komme ich leider nicht weiter.
Das Problem ist hier auch, dass ich das ganze erst hinter Beispiel> angehängt haben möchte und nicht schon hinter ist> kann mir da jemand helfen? Gruß
BB
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13225
|
Moin, ich mach sowas immer mit 's': | $ var='das um etwas ergänzt wurde'
$ echo 'Dies ist> ein Beispiel >' | sed 's#$#'"${var}#"
Dies ist> ein Beispiel >das um etwas ergänzt wurde
|
Und wenn der Begrenzer (hier "#") im String vorkommen kann, muss man ihn noch escapen: | $ var='das um etwas # ergänzt wurde'
$ echo 'Dies ist> ein Beispiel >' | sed 's#$#'"${var/\#/\\#}#"
Dies ist> ein Beispiel >das um etwas # ergänzt wurde
|
Ciao robert
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2510
|
Servus, zusammen mit
deinem anderen Thread sieht es nun wirklich so aus, als würdest du fold
statt sed suchen. Hier mal ein Beispiel: $ cat data
Hallo, Welt!
Das hier ist ein längerer Text. Der Knackpunkt dieses Textes ist, dass die Zeilen recht lang sind. Insbesondere sind sie länger als 40 Zeichen. „fold“ wird jetzt verwendet, um die Zeilenlänge entsprechend anzupassen. Nagut, ich gebe zu, das hier ist nur eine einzige Zeile gewesen, nicht mehrere. ;-)
$ fold -sw 40 data
Hallo, Welt!
Das hier ist ein längerer Text. Der
Knackpunkt dieses Textes ist, dass die
Zeilen recht lang sind. Insbesondere
sind sie länger als 40 Zeichen.
„fold“ wird jetzt verwendet, um die
Zeilenlänge entsprechend anzupassen.
Nagut, ich gebe zu, das hier ist nur
eine einzige Zeile gewesen, nicht
mehrere. ;-)
$ Aber um deine ursprüngliche Frage auch zu beantworten: Der a-Befehl von
sed fügt eine neue Zeile unter die aktuelle Zeile an. Du möchtest aber
eine existierende Zeile verändern. Also brauchst du den s-Befehl. Der
Knackpunkt wäre, dass dein regulärer Ausdruck, der das zu verändernde
Muster angibt, einfach nur auf das Zeilenende passt. Also im Prinzip so:
sed 's/$/hier steht der zusätzliche Text/' Als konkretes Beispiel:
1
2
3
4
5
6
7
8
9
10
11
12 | #!/bin/bash
textbisher='Erste Zeile
Zweite Zeile
Dritte Zeile
Und so weiter'
dazu=' und dies ist das Ende der zweiten Zeile'
textneu=$(echo "$textbisher" | sed "2s/$/$dazu/")
echo "$textneu"
|
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Also mich würde mal der globale Anwendungsfall interessieren... irgend wie habe ich den Verdacht, der OP versucht eine Templating-Engine nachzubauen...
|
Budada_Bubladend
(Themenstarter)
Anmeldungsdatum: 13. Dezember 2009
Beiträge: 812
|
Danke für die vielen Antworten!
Die Antwort von rklm hat mir auf jeden Fall geholfen.
Ich nehme mir aber auf jeden Fall mal fold zu Herzen Vain 😉
Da du mich ja schon das letzte mal so schön darauf hingewiesen hast ☺ Gruß
BB
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Budada Bubladend schrieb: Ich nehme mir aber auf jeden Fall mal fold zu Herzen Vain 😉
Da du mich ja schon das letzte mal so schön darauf hingewiesen hast ☺
Genau genommen war ich das 😉 Magst Du uns nicht mal den Hintergrund beschreiben? Also wofür Du das alles brauchst?
|
Budada_Bubladend
(Themenstarter)
Anmeldungsdatum: 13. Dezember 2009
Beiträge: 812
|
Genau genommen war ich das 😉
Ich bitte vielmals um Entschuldigung Lysander.
Ich danke dir für diesen Hinweis! ☺
Magst Du uns nicht mal den Hintergrund beschreiben? Also wofür Du das alles brauchst?
Eigentlich soll daraus nichts großes Werden...
Es ist mehr eine kleine Spielerei von mir...
Vielleicht poste ich es hier, wenn es Fertig ist...
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13225
|
Hallo, Budada Bubladend schrieb: Magst Du uns nicht mal den Hintergrund beschreiben? Also wofür Du das alles brauchst?
Eigentlich soll daraus nichts großes Werden...
Es ist mehr eine kleine Spielerei von mir...
Vielleicht poste ich es hier, wenn es Fertig ist...
Dir ist schon klar, dass das überhaupt keine Antwort auf Lysanders Frage ist, oder? Es gibt gute Gründe, Dinge unter der Decke zu halten. Im aktuellen Fall sehen ich die aber eher nicht. Letztlich schadest Du Dir selber, denn das Feedback, das Du hier bekommst, kann nur so gut sein, wie die Informationen, die Du preisgibst. Bis neulich robert
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Budada Bubladend schrieb: Ich danke dir für diesen Hinweis! ☺
Hehe... naja, fishing for compliments war nicht meine Absicht; aber wenn man jemanden lobt, darf es ruhig der richtige sein 😉 rklm und ich reiten deswegen auf Deinem Anwendungsfall herum, weil wir hier (und in anderen Foren ebenso) oftmals XY-Probleme lösen. Und das kann man frühzeitig umgehen, wenn man mehr über den Hintergrund weiß.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17625
Wohnort: Berlin
|
Wenn man keine Hashzeichen # verwendet:
| echo 'Dies ist> ein Beispiel >' | sed 's#$#'"${var}#"
|
sondern den Standardtrenner / Slash
| echo 'Dies ist> ein Beispiel >' | sed s/$/"${var}/"
|
muss man weniger quoten.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13225
|
Hi, user unknown schrieb: Wenn man keine Hashzeichen # verwendet:
| echo 'Dies ist> ein Beispiel >' | sed 's#$#'"${var}#"
|
sondern den Standardtrenner / Slash
| echo 'Dies ist> ein Beispiel >' | sed s/$/"${var}/"
|
muss man weniger quoten.
Dafür wird dann das Escapen ekliger.
| $ var='a/b'
$ echo 'Dies ist> ein Beispiel >' | sed "s/$/${var/\//\\/}/"
Dies ist> ein Beispiel >a/b
|
Ciao robert
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17625
Wohnort: Berlin
|
Bei
sieht da Dein Code auch nicht besser aus.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13225
|
user unknown schrieb: Bei
sieht da Dein Code auch nicht besser aus.
Zugegeben... 😬 Dann offeriere ich noch "s:::":
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | $ for var in 'a/b' 'a#b' 'a:b'; do
> echo 'Dies ist> ein Beispiel >' | sed 's#$#'"${var/\#/\\#}#"
> echo 'Dies ist> ein Beispiel >' | sed "s/$/${var/\//\\/}/"
> echo 'Dies ist> ein Beispiel >' | sed "s:$:${var/:/\\:}:"
> done
Dies ist> ein Beispiel >a/b
Dies ist> ein Beispiel >a/b
Dies ist> ein Beispiel >a/b
Dies ist> ein Beispiel >a#b
Dies ist> ein Beispiel >a#b
Dies ist> ein Beispiel >a#b
Dies ist> ein Beispiel >a:b
Dies ist> ein Beispiel >a:b
Dies ist> ein Beispiel >a:b
|
Ciao robert
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Bei dieser Bauart ist das eigentliche Problem der Backslash: track@lucid:~$ for var in 'a/b/c' 'a#b#c' 'a\b\c'; do
> echo 'Dies ist> ein Beispiel >' | sed 's#$#'"${var/\#/\\#}#"
> echo 'Dies ist> ein Beispiel >' | sed "s/$/${var/\//\\/}/"
> echo 'Dies ist> ein Beispiel >' | sed "s:$:${var/:/\\:}:"
> done
Dies ist> ein Beispiel >a/b/c
sed: -e Ausdruck #1, Zeichen 10: Unbekannte Option für `s'
Dies ist> ein Beispiel >a/b/c
sed: -e Ausdruck #1, Zeichen 10: Unbekannte Option für `s'
Dies ist> ein Beispiel >a#b#c
Dies ist> ein Beispiel >a#b#c
Dies ist> ein Beispiel >ab\
Dies ist> ein Beispiel >ab\
Dies ist> ein Beispiel >ab\ Den müsste man wohl noch zusätzlich escapen: var="${var // \\/\\\\}"; Überhaupt sollten hier alle Ersetzungen "generell" erfolgen, sonst macht es ab dem 2. Sonderzeichen Ärger. Also so: for var in 'a/b/c' 'a#b#c' 'a\b\c'; do
var="${var//\\/\\\\}"
echo 'Dies ist> ein Beispiel >' | sed 's#$#'"${var//\#/\\#}#"
echo 'Dies ist> ein Beispiel >' | sed "s/$/${var//\//\\/}/"
echo 'Dies ist> ein Beispiel >' | sed "s:$:${var//:/\\:}:"
done LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13225
|
track schrieb: Bei dieser Bauart ist das eigentliche Problem der Backslash:
Überhaupt sollten hier alle Ersetzungen "generell" erfolgen, sonst macht es ab dem 2. Sonderzeichen Ärger.
Wie unangenehm - aber Du hast ja so Recht! 😬 Nun denn, dann also:
| $ for var in 'a/b' 'a#b' 'a:b' 'a\b'; do
> echo 'Dies ist> ein Beispiel >' | sed "s:$:$(echo -n "$var" | sed 's#[:\\]#\\&#g'):"
> done
Dies ist> ein Beispiel >a/b
Dies ist> ein Beispiel >a#b
Dies ist> ein Beispiel >a:b
Dies ist> ein Beispiel >a\b
|
Bis dann robert
|