• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Zeile aus einer Datei löschen mit sed[gelöst]

intergo

Member
Hallo, habe mir zwar schon den Thread dazu angeschaut und ausprobiert nur es klappt nicht wie erhofft.
Mein Problem ist, dass die Zeilen in der Datei mit einer Zeilennummer versehen sind und das Programm fragt die Zeilennummer ab , damit er weiß, welche Zeile gelöscht werden muss.
Das erkennt er auch ,er sucht mir die richtige Zeile raus ,nur wenn ich Sie lösche, wird sie zwar in der temp Datei geschrieben , doch Sie bleibt auch in der Originaldatei erhalten, warum?


Mein Code:

Code:
#! /bin/bash
#set -x 
#Adressen verwalten
zeile=1
if [ ! -f name.txt ]
  then
  touch name.txt
  
fi


      while true 
	do
	echo "--------------------------------------------------"
	echo "Adresssatz einfügen 			: e"
	echo "Adresse ausgeben (Satznummer eingeben) 	: a"
	echo "Adresse ausgeben (Nachnamenanfang)	: n"
	echo "Adresssatz sortiert ausgeben 		: s"
	echo "Adresssatz löschen (Satznummer)		: l"
	echo "Ende+Informationen			: i"
	echo ""    
	echo "--------------------------------------------------"


      echo -n "Geben Sie bitte Ihre Auswahl an : "
      read auswahl
      
	  case $auswahl in




		e) echo " Bitte den Nachnamen eingeben : "
		   read nachname
		   

		   echo " Bitte den Vorname eingeben	  : "
		   read vorname
		    
		    
		   echo  "Bitte den die Strasse eingeben: "
		   read strasse
		     
		  
		   echo  "Bitte die Postleitzahl eingeben: "
		   read plz
		    
	      
		   echo  "Bitte den Wohnort eingeben: "
		   
		   read ort
		    

		   echo "$zeile : $nachname : $vorname : $strasse : $plz : $ort"  >>name.txt
		  
		   sort name.txt >name.sort
		   mv name.sort name.txt
		    
		   
		  
		   zeile=$[$zeile+1]
		   echo "**************************************"
		   echo "Die Adresseingaben wurden gspeichert"
		   echo "**************************************";;
	    


		      a) echo " Geben Sie bitte die Satznummer ein (Zahlen) :"
			read zeile
			a=`grep "$zeile" name.txt`
			echo $a;;

			    
			    n) echo " Geben Sie bitte den Anfangsbuchstaben des Nachnamens ein :"
			    read anfang
			   
			    b=`cat name.txt | grep '^.\{4\}'$anfang`
			    echo $b;;
			    

			  
			      s)echo "Hier wurde Ihnen der Komplette Adresssatz ausgegeben"
			      echo "++++++++++++++++++++++++++++++++++++++++++++++"
			      cat name.txt
			      echo "++++++++++++++++++++++++++++++++++++++++++++++";;
					    i) echo "Dateiinformation"
				            echo "**********************************************************"
					    file name.txt
					    d=`ls -l name.txt`
					    echo $d
					    echo "**********************************************************";;

						  
				  
				l) echo "Geben Sie bitte die Satznummer, um den entsprechenden Adressatz zu loeschen :"
						read zeile
						c=`grep ^$zeile name.txt`
						echo $c
						echo "Sie löschen gerade $zeile"
						echo "Sind Sie sicher ? [j/n]"
						    read eingabe
						    case $eingabe in
							  j) sed /{$c}/d name.txt < temp;;
							  n) echo "Ok, wird nicht gelöscht";;
		



				
						*) echo "Ungültige Auswahl,bitte Auswahlmenue beachten"
						    exit;;
						    esac


				     
			  
		    
			  
			
			  			
			  
		esac

done
 

RME

Advanced Hacker
Hallo,

Ich habe mir nicht die Mühe gemacht das ganze Script zu studieren :D ... aber ich denke das Problem ist hier:

Code:
j) sed /{$c}/d name.txt < temp;;
sollte vielleicht sein:

Code:
j) sed /$c/d name.txt > temp.txt;;
So wird die Datei "name.txt" in die Datei "tmp.txt" kopiert, aber ohne die gelöschte Zeile. "name.txt" bleibt dabei unangetastet.

Hoffe dies hilft.

Nur so nebenbei: Du könntest das Script auch etwas ordentlicher schreiben, umsomehr wenn Du möchtest dass andere dieses lesen sollen. Hier eine etwas besseres (sorgfältigere) Darstellung:

Code:
#! /bin/bash
#set -x
#Adressen verwalten

zeile=1
if [ ! -f name.txt ]
  then
  touch name.txt
fi

while true
  do
  echo "--------------------------------------------------"
  echo "Adresssatz einfügen                    : e"
  echo "Adresse ausgeben (Satznummer eingeben) : a"
  echo "Adresse ausgeben (Nachnamenanfang)     : n"
  echo "Adresssatz sortiert ausgeben           : s"
  echo "Adresssatz löschen (Satznummer)        : l"
  echo "Ende+Informationen                     : i"
  echo "--------------------------------------------------"
  echo -n "Geben Sie bitte Ihre Auswahl an : "
  read auswahl

  case $auswahl in
    e) echo " Bitte den Nachnamen eingeben : "
       read nachname

       echo " Bitte den Vorname eingeben     : "
       read vorname

       echo  "Bitte den die Strasse eingeben: "
       read strasse

       echo  "Bitte die Postleitzahl eingeben: "
       read plz

       echo  "Bitte den Wohnort eingeben: "
       read ort

       echo "$zeile : $nachname : $vorname : $strasse : $plz : $ort"  >>name.txt

       sort name.txt >name.sort
       mv name.sort name.txt

       zeile=$[$zeile+1]
       echo "**************************************"
       echo "Die Adresseingaben wurden gspeichert"
       echo "**************************************";;

    a) echo " Geben Sie bitte die Satznummer ein (Zahlen) :"
       read zeile
       a=`grep "$zeile" name.txt`
       echo $a;;

    n) echo " Geben Sie bitte den Anfangsbuchstaben des Nachnamens ein :"
       read anfang
       b=`cat name.txt | grep '^.\{4\}'$anfang`
       echo $b;;

    s) echo "Hier wurde Ihnen der Komplette Adresssatz ausgegeben"
       echo "++++++++++++++++++++++++++++++++++++++++++++++"
       cat name.txt
       echo "++++++++++++++++++++++++++++++++++++++++++++++";;

    i) echo "Dateiinformation"
       echo "**********************************************************"
       file name.txt
       d=`ls -l name.txt`
       echo $d
       echo "**********************************************************";;

    l) echo "Geben Sie bitte die Satznummer, um den entsprechenden Adressatz zu loeschen :"
       read zeile
       c=`grep ^$zeile name.txt`
       echo $c
       echo "Sie löschen gerade $zeile"
       echo "Sind Sie sicher ? [j/n]"
       read eingabe
       case $eingabe in
         j) sed /$c/d name.txt > temp;;
         n) echo "Ok, wird nicht gelöscht";;
         *) echo "Ungültige Auswahl,bitte Auswahlmenue beachten"
         exit;;
       esac
  esac
done
Gruss,
Roland
 

spoensche

Moderator
Teammitglied
Code:
sed /{$c}/d name.txt < temp

Der Aufruf stimmt nicht ganz.

Code:
sed -ri '{$c}d' name.txt

Der Parameter "-i" sagt dem Sed, das einer Zeile editieren und diese einfügen soll und gibt dann auch keinen Inhalt der Datei aus.
 
OP
I

intergo

Member
Ok ,der letzte mit sed -ri geht nicht da bekomme ich eine Fehlermeldung:
sed: -e Ausdruck #1, Zeichen 0: unmatched `{'
 
Oben