Sed befehl benötigt

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
debuser1988
Beiträge: 210
Registriert: 02.09.2009 20:23:05

Sed befehl benötigt

Beitrag von debuser1988 » 29.09.2010 14:31:03

Guten Tag,

und zwar versuche ich gerade einen text zu verändern per Sed.
Also ich habe ein Interface worüber man Mumble Voiceserver starten kann, in den Einstellungen kann man einen Willkommenstext angeben. Dieser Willkommenstext wird über FTP an den Mumble Server übertragen.
Jetzt möchte ich mit Sed einen textabschnitt an diesen gerade angegebenen Text anhängen.

Wie ist das umzusetzen ? Der Textabschnitt wird mit einer Variable dran gehängt.

Hier mal mein Sed Abschnitt:

sed -e '/welcometext=/c\welcometext=mumbleserver' mumble-server.ini > backup.ini

Die Option "i" von Sed kenne ich nur weiß ich nicht wie ich daraus einen Befehl bauen kann.

Gruß

Debuser1988
## Internet ##
Telekom VDSL 100 / 40
## Router ##
Speedport W724v + PFSense im CARP HA
## System Konfiguration ##
Multiboot: Debian
## Blog ##
http://blog.mincore.de

JonnyBravo
Beiträge: 7
Registriert: 14.10.2010 22:26:25
Wohnort: Radebeul

Re: Sed befehl benötigt

Beitrag von JonnyBravo » 14.10.2010 23:17:42

Hallo,

bei der variable scheitert es bei mir auch noch hab ihr aber ein Beispiel wo es ohne var geht.
vllt hift es dir

Code: Alles auswählen

sed -i -e '/^vorhandenes Wort/s!$! nachfolgende Wörter!'  Datei
Da Slashes (/) ein Trennzeichen ist , sind in diesen keine Variablen möglich stattdessen sollte man (") (somit kein !) und # nutzen, doch da ist auch genau mein Problem denn ich bekomme es nicht hin das sed mir über eine var das Wort plus 5 Zeilen darunter löscht
mein code

Code: Alles auswählen

if  sed -i -e "#$name#{N;N;N;N;N;d}" $smb
	          	  	    then 
          	  	    	     echo "Freigabe würde gelöscht"
          	  	           else 
          	  	    	echo "konnte freigabe nicht löschen . Bitte prüfen Sie ihre Rechte !!" fi 
ja man-page gelesen ..google brachte auch keinen Erfolg
da diese Probleme selber Natur sind wollte ich keinen neuen thread eröffnen.
Ich entschuldige mich für die Unannehmlichkeiten !!

gre
Jonny

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Sed befehl benötigt

Beitrag von rendegast » 15.10.2010 06:46:36

meine-mum.sh:

Code: Alles auswählen

#!/bin/sh

sed -i "s@^welcometext=.*@welcometext=@" mumble-server.ini
egrep "^welcometext=" mumble-server.ini
# (wirklich geloescht!)

WELCOME='"<br />Welcome to this server running <b>Murmur</b>.<br />Enjoy your stay!<br />"'
echo "$WELCOME"                # Durch die single-quotes werden auch die Quotes wiedergegeben.

# Einfügen als Variable:
sed -i "s@^welcometext=.*@welcometext=$WELCOME@" mumble-server.ini
egrep "^welcometext=" mumble-server.ini
Nebengedanke:
Wegen der eventuellen Codezeichen im html-Text muß hier genau aufgepaßt und penibel gequotet werden,
das Script würde schließlich mit root-Rechten ausgeführt.
Ist der Gimmick des Welcome das Risiko wert?




@JonnyBravo
JonnyBravo hat geschrieben: echo "Freigabe würde gelöscht"
Speziell Dein Problem, anderer Ansatz, /etc/samba/smb.conf:

Code: Alles auswählen

# shares :
include = /etc/samba/smb.conf.d/shareA.conf
include = /etc/samba/smb.conf.d/shareB.conf
include = /etc/samba/smb.conf.d/shareC.conf
-> shareA deaktivieren:

Code: Alles auswählen

$ sed -i  's@^\(include.*shareA.conf\)@#\1@'  smb.conf

$ cat smb.conf
# shares :
#include = /etc/samba/smb.conf.d/shareA.conf
include = /etc/samba/smb.conf.d/shareB.conf
include = /etc/samba/smb.conf.d/shareC.conf
Reaktivieren:

Code: Alles auswählen

$ sed -i  's@^#\(include.*shareA.conf\)@\1@'  smb.conf
(eventuell muß das "#" noch gequotet werden)
Und mit Variabler:

Code: Alles auswählen

$ VARA=shareB; sed -i "s@^\(include.*${VARA}\)@#\1@" smb.conf 
$ VARA=shareB; sed -i "s@^#\(include.*${VARA}\)@\1@" smb.conf 
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

JonnyBravo
Beiträge: 7
Registriert: 14.10.2010 22:26:25
Wohnort: Radebeul

Re: Sed befehl benötigt

Beitrag von JonnyBravo » 15.10.2010 18:19:42

herzlichen danke @rendegast , auf diese simple Lösung bin ich ehrlich gesagt nicht gekommen .. werde deinen Ansatz in die tat umsetzen ..danke ....

so hab jetzt angefangen um zubauen ...



das auskommentieren des include ist nicht möglich mit einer variable
auch mir "'#" nicht

Code: Alles auswählen

$ VARA=shareB; sed -i "s@^#\(include.*${VARA}\)@\1@" smb.conf 
anbei mal die Funktion vllt. gibt es ja auch da einen Fehler nicht lachen bin Anfänger kein Senior.

Code: Alles auswählen

ask(){
smb=/etc/samba
printf "Wie heißt die freigabe : " 
read name
 if ls $smb |grep $name >> /dev/null
          then 
          	echo "Diese freigabe existiert schon"
          	printf "Was möchten Sie tun \n"
          		select frei in "Freigeben" "sperren" "nichts"
          			do
          			case $frei in 
          			freigeben) sed -i "s@^"#"\(include.*${name}*\)@\1@" $smb/smb.conf;;
          			sperren)if sed -i "s@^\(include.*${name}*\)@#\1@" $smb/smb.conf
        	           	  	    then 
          	  	    	echo "freigabe würde gesperrt "
                                           else
          	  	        echo "nicht möglich"
                                fi	
          			;;
						nichts)break ;;          			
          			esac	
          			done
          else 
          	echo "wird erstellt"
          	 printf "[$name]\n" >> $smb/$name.conf
          	 	echo "include = /etc/samba/$name.conf" >> $smb/smb.conf
					printf "Gib bitte ein kommentar für das Verzeichniss an z.B geschäftlich,privat :  "
					read commn
					echo "comment = $commn" >> $smb/$name.conf
					 printf "In welchen verzeichniss liegt die Freigabe z.B /home/root/dokumente :"
					 read wo 
					 echo "path = $wo" >> $smb/$name.conf
					 printf "sollen nur bestimmt User oder gruppen zugriff haben bei nein haben alle rwx ? j|n  (bei nein bekommen alle zurgriff): "
					 read zu 
					    if [ $zu = "j" ]
					    			then 
					    				select group in "gruppen" "User" "User sperren" "gruppe sperren" "end"
					    				 do
					    					case $group in 
					    					gruppe);;
					    					User) printf "Wie heißt der User \n(User bitte mit script anlegen da dieses denn unix und samba benutzer anlegt)\n Name :"
													read unixname					    					 
					    					 if grep $unixname $smb/$name.conf
					    					 			then 
					    					 				echo "dieser User hat bereits eine freigabe"
					    					 			else 
					    					 				echo "wird erstellt" 
					    					 				echo "valid user = $unixname" >> $smb/$name.conf
					    					 fi
					    					 ;;
					    					"User sperren");;
					    					"gruppe sperren");;
					    					end);;
					    					esac
					    				 done
					    			else 
					    				echo "n"
					    fi
 fi
          	 } 
bedenke es ist noch lange nicht fertig ....

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Sed befehl benötigt

Beitrag von rendegast » 26.10.2010 09:10:26

JonnyBravo hat geschrieben:das auskommentieren des include ist nicht möglich mit einer variable
auch mir "'#" nicht

Code: Alles auswählen

    $ VARA=shareB; sed -i "s@^#\(include.*${VARA}\)@\1@" smb.conf 
"'#" nicht
Ist das Single-Quote da nur reingerutscht?
Weiß nicht recht was Du meinst, da der Ausdruck funktioniert.
(Wegen des "$" vor VARA, ich habe das als normaler Benutzer auf eine beliebige Testdatei smb.conf angewendet,
sollte damit die /etc/samba/smb.conf bearbeitet werden, sind root-Rechte nötig,
zudem hinterher wohl auch ein '/etc/init.d/samba reload'.)
Oder ist das auf die Funktion ask() bezogen?

Code: Alles auswählen

                select frei in "Freigeben" "sperren" "nichts"
                   do
                   case $frei in
                   freigeben) sed -i "s@^"#"\(include.*${name}*\)@\1@" $smb/smb.conf;;
"Freigeben" <-> freigeben)
und

Code: Alles auswählen

sed -i "s@^"#"\(include.*${name}*\)@\1@" $smb/smb.conf
Ich habe zwar erwähnt, das "#" eventuell zu kommentieren,
aber nach mehreren Versuchen ist das für dieses Zeichen im sed-Ausdruck wohl nicht nötig, weder im ersten noch im zweiten Teil.
(erster/zweiter Teil wegen: In einem "s@...@...@" muß im ersten Teil meiner Erfahrung nach saubereres Regex geschrieben werden, der zweite Teil verhält sich dagegen toleranter)
Mehr noch könnte es hier den sed-Ausdruck sogar unterbrechen,
so wird es zumindest im Syntaxhighlighting von vim und mcedit angezeigt.

Code: Alles auswählen

                               select group in "gruppen" "User" "User sperren" "gruppe sperren" "end"
                                do
                                  case $group in
                                  gruppe);;
"gruppen" <-> gruppe)
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

JonnyBravo
Beiträge: 7
Registriert: 14.10.2010 22:26:25
Wohnort: Radebeul

Re: Sed befehl benötigt

Beitrag von JonnyBravo » 26.10.2010 10:36:08

Ich entschuldige mich , das Problem lag an der case freigabe);; ich hatte es im selectieren groß geschrieben :oops:

wenn ich wieder vor einen sed Befehl stehe werde ich mich nochmal melden ... (was in diesen script wohl häufiger auftritt )

Danke :THX:

Antworten