ubuntuusers.de

sed - Inhalt einer Variable an bestimmte Zeile anhängen

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Budada_Bubladend

Avatar von 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 Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13225

Moin,

ich mach sowas immer mit 's':

1
2
3
$ 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:

1
2
3
$ 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

Avatar von 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

Avatar von 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)
Avatar von Budada_Bubladend

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

Avatar von 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)
Avatar von Budada_Bubladend

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 Team-Icon

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

Avatar von 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

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Wenn man keine Hashzeichen # verwendet:

1
echo 'Dies ist> ein Beispiel >' | sed 's#$#'"${var}#"

sondern den Standardtrenner / Slash

1
echo 'Dies ist> ein Beispiel >' | sed s/$/"${var}/"

muss man weniger quoten.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13225

Hi,

user unknown schrieb:

Wenn man keine Hashzeichen # verwendet:

1
echo 'Dies ist> ein Beispiel >' | sed 's#$#'"${var}#"

sondern den Standardtrenner / Slash

1
echo 'Dies ist> ein Beispiel >' | sed s/$/"${var}/"

muss man weniger quoten.

Dafür wird dann das Escapen ekliger.

1
2
3
$ var='a/b'
$ echo 'Dies ist> ein Beispiel >' | sed "s/$/${var/\//\\/}/"
Dies ist> ein Beispiel >a/b

Ciao

robert

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Bei

var="a#b" 

sieht da Dein Code auch nicht besser aus.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13225

user unknown schrieb:

Bei

var="a#b" 

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

Avatar von 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 Team-Icon

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:

1
2
3
4
5
6
7
$ 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

Antworten |