ubuntuusers.de

Textdateien mittels Shell Script bearbeiten

Status: Ungelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

dolfi56

Anmeldungsdatum:
13. Mai 2014

Beiträge: 132

Hallo, ich schreibe zur Zeit an einem "einfachen" Shellscript und brauche da etwas Hilfe.

Ich möchte folgende Aktionen auslösen:

  • Gehe zu /Pfad/Datei.txt und füge hinter der letzten Zeile eine neue Zeile mit folgendem Inhalt ein: "TEXT"

  • Gehe zu /Pfad/Datei.txt und füge hinter der letzten Zeile eine neue Zeile mit folgendem Inhalt ein: "TEXT [neue Zeile] TEXT2"

  • Gehe zu /Pfad/Datei.txt Suche "BEGRIFF" und lösche diese Zeile

  • Gehe zu /Pfad/Datei.txt Suche "BEGRIFF" und lösche diese und die vorherige Zeile

Wie bekomme ich das hin?? Wäre super, wenn ihr mir helfen könntet!!!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17606

Wohnort: Berlin

dolfi56 schrieb:

Hallo, ich schreibe zur Zeit an einem "einfachen" Shellscript und brauche da etwas Hilfe.

Ich möchte folgende Aktionen auslösen:

  • Gehe zu /Pfad/Datei.txt und füge hinter der letzten Zeile eine neue Zeile mit folgendem Inhalt ein: "TEXT"

1
echo TEXTE >> /Pfad/Datei.txt
  • Gehe zu /Pfad/Datei.txt und füge hinter der letzten Zeile eine neue Zeile mit folgendem Inhalt ein: "TEXT [neue Zeile] TEXT2"

1
echo -e "TEXTE \n TEXT2" >> /Pfad/Datei.txt
  • Gehe zu /Pfad/Datei.txt Suche "BEGRIFF" und lösche diese Zeile

1
sed '/BEGRIFF/d' /Pfad/Datei.txt
  • Gehe zu /Pfad/Datei.txt Suche "BEGRIFF" und lösche diese und die vorherige Zeile

1
2
3
row1=$(grep -n BEGRIFF  /Pfad/Datei.txt | sed 's/:.*//')
row0=$((row1-1))
sed "${row0},${row1}d" /Pfad/Datei.txt

Wie bekomme ich das hin?? Wäre super, wenn ihr mir helfen könntet!!!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17606

Wohnort: Berlin

Dies

1
sed '/BEGRIFF/d' /Pfad/Datei.txt

gibt nur den veränderten Inhalt aus.

1
sed '/BEGRIFF/d' /Pfad/Datei.txt > /Pfad/Datei2.txt

schreibt es in eine Datei2.txt .

1
sed -i '/BEGRIFF/d' /Pfad/Datei.txt

ändert inplace.

Der Befehl löscht übrigens alle Zeilen die passen.

dolfi56

(Themenstarter)

Anmeldungsdatum:
13. Mai 2014

Beiträge: 132

user unknown schrieb:

dolfi56 schrieb:

Hallo, ich schreibe zur Zeit an einem "einfachen" Shellscript und brauche da etwas Hilfe.

Ich möchte folgende Aktionen auslösen:

  • Gehe zu /Pfad/Datei.txt und füge hinter der letzten Zeile eine neue Zeile mit folgendem Inhalt ein: "TEXT"

1
echo TEXTE >> /Pfad/Datei.txt
  • Gehe zu /Pfad/Datei.txt und füge hinter der letzten Zeile eine neue Zeile mit folgendem Inhalt ein: "TEXT [neue Zeile] TEXT2"

1
echo -e "TEXTE \n TEXT2" >> /Pfad/Datei.txt

Super geht schon einmal ...

Eine Funktion bräuchte ich noch: Gehe in DATEI.TXT suche nach "$Benutername" und setze den Inhalt hinter "$Benutzername " als Variable X fest

Hintergrund: In der DATEI.TXT liegt immer folgender Inhalt vor:

Nutzer1 Konto2
Nutzer2 Konto2

Nun soll er nach Nutzer2 suchen und mit X=Konto machen ...

Wenn ich das habe, kann ich dann mit

sed $X/d /Pfad/Datei.txt

die entsprechende Zeile in anderen Dateien löschen ...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17606

Wohnort: Berlin

dolfi56 schrieb:

Eine Funktion bräuchte ich noch: Gehe in DATEI.TXT suche nach "$Benutername" und setze den Inhalt hinter "$Benutzername " als Variable X fest

Hintergrund: In der DATEI.TXT liegt immer folgender Inhalt vor:

Nutzer1 Konto2
Nutzer2 Konto2

Beide Konto2 - das ist doch sicher wieder falsch!

Nun soll er nach Nutzer2 suchen und mit X=Konto machen ...

Was machen - hoffentlich keine Sauereien!

1
2
3
4
5
6
kt=$(echo '
> Nutzer1 Konto2
> Nutzer2 Konto2' | sed -rn 's/.*Nutzer2 (.*)/\1/p') 

echo $kt
Konto2

Wenn ich das habe, kann ich dann mit

sed $X/d /Pfad/Datei.txt

die entsprechende Zeile in anderen Dateien löschen ...

Wollen wir es hoffen. ☺

dolfi56

(Themenstarter)

Anmeldungsdatum:
13. Mai 2014

Beiträge: 132

Hallo, ja ich habe mich wohl verschrieben. Das Script funktioniert aber irgendwie nicht.

Script:

1
2
3
4
5
6
#!/bin/bash
read -p 'Benutzername: ' benutzername

kt=$( echo > test.txt | sed -rn 's/.*$benutzername (.*)/\1/p') 

echo $kt

und in der test.txt befindet sich nur folgendes:

Baum Wald
Frosch Apfel

Wenn er nach Frosch sucht, sollte dann kt=Apfel sein ...

die antwort ist:

#!/bin/bash
read -p 'Benutzername: ' benutzername

kt=$(cat test.txt | sed -rn "s/.*$benutzername (.*)/\1/p")

echo $kt

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17606

Wohnort: Berlin

dolfi56 schrieb:

Hallo, ja ich habe mich wohl verschrieben. Das Script funktioniert aber irgendwie nicht.

Script:

1
2
3
4
5
6
#!/bin/bash
read -p 'Benutzername: ' benutzername

kt=$( echo > test.txt | sed -rn 's/.*$benutzername (.*)/\1/p') 

echo $kt

Was soll denn echo > test.txt an Output produzieren?

echo gibt eine Zeichenfolge am Bildschirm aus. Du läßt die Zeichenfolge weg, also gibst nichts aus und lenksts es in die Datei text.txt. Da landet also allenfalls ein Umbruch oder Blank.

Den Output dessen, den es nicht gibt, lenkst Du an sed um. Was soll das werden?

dolfi56

(Themenstarter)

Anmeldungsdatum:
13. Mai 2014

Beiträge: 132

das mit dem echo ist mir dann auch aufgefallen ☺ aber wie du siehst, konnte ich das gewünschte Ergebnis mit cat herstellen ...

nun habe ich noch das folgende Problem.

user unknown schrieb:

  • Gehe zu /Pfad/Datei.txt Suche "BEGRIFF" und lösche diese Zeile

1
sed '/BEGRIFF/d' /Pfad/Datei.txt

das funktioniert garnicht, egal was ich am Syntax noch ändere. Um bei diesem Beispiel zu bleiben: BEGRIFF wäre dann $BEGRIFF ... aber auch ohne $ funktioniert es bei mir nicht ... ich setze sed 4.2.1 ein (was laut http://en.kioskea.net/faq/1451-sed-delete-one-or-more-lines-from-a-file problemlos wäre ...)

auch für das Problem gabe s eine Lösung:

#Löschen Postfix
sed -e "/$mailadress/d" test2.txt > test.txt

danach die test2.txt löschen und die test.txt in test2.txt umbenennen ...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17606

Wohnort: Berlin

dolfi56 schrieb:

  • Gehe zu /Pfad/Datei.txt Suche "BEGRIFF" und lösche diese Zeile

1
sed '/BEGRIFF/d' /Pfad/Datei.txt

das funktioniert garnicht, egal was ich am Syntax noch ändere.

An der Syntax. Was heißt funktioniert gar nicht? Ändert nicht die Urdatei sondern gibt die geänderte Datei aus? Ja, die Anmerkungen aus meinem Posting 2 gelten nicht nur für den ersten Befehl, sondern sind auf die anderen entsprechend zu übertragen.

Um bei diesem Beispiel zu bleiben: BEGRIFF wäre dann $BEGRIFF ... aber auch ohne $ funktioniert es bei mir nicht ... ich setze sed 4.2.1 ein (was laut http://en.kioskea.net/faq/1451-sed-delete-one-or-more-lines-from-a-file problemlos wäre ...)

"Funktioniert nicht" ist keine sinnvolle Fehlerbeschreibung.

auch für das Problem gabe s eine Lösung:

#Löschen Postfix
sed -e "/$mailadress/d" test2.txt > test.txt

danach die test2.txt löschen und die test.txt in test2.txt umbenennen ...

Tja, das war ja eine der Anmerkungen.

dolfi56

(Themenstarter)

Anmeldungsdatum:
13. Mai 2014

Beiträge: 132

user unknown schrieb:

Tja, das war ja eine der Anmerkungen.

inplace ist für mich Informatikfachsprache, davon hab ich keine Ahnung 🙄

mit

sed -i "/BEGRIFF/d" /Pfad/zur/Datei

ging es dann auch. Meine Scripte zum Hinzufügen und Löschen von Benutzern sind damit fertig und funktionieren. Danke!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11250

Wohnort: München

dolfi56 schrieb:

inplace ist für mich Informatikfachsprache, davon hab ich keine Ahnung 🙄

Manpage lesen bildet 😉 http://manpages.ubuntu.com/manpages/trusty/de/man1/sed.1.html

        -i[ENDUNG], --in-place[=ENDUNG]

             Dateien an Ort und Stelle bearbeiten (erstellt Sicherung,  falls ENDUNG angegeben)

dolfi56

(Themenstarter)

Anmeldungsdatum:
13. Mai 2014

Beiträge: 132

seahawk1986 schrieb:

dolfi56 schrieb: Manpage lesen bildet 😉 http://manpages.ubuntu.com/manpages/trusty/de/man1/sed.1.html

😬

Ich bräuchte noch mal eure Hilfe für folgende Befehle:

  • Suche nach "smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache" und füge dahinter in eine neue Zeile den Inhalt der Datei "addPostfix_ssl.txt" (inkl. Zeilenumbrüche) ein.

  • Suche in der Datei "test.txt" nach " # mode = 0666" und ersetze den Inhalt der nächsten Zeile mit " }" ab.

  • Wie bekomme ich den Inhalt einer Datei (inkl. Zeilenumbrüche) in eine vorhandene eingefügt? Das muss ja irgendwas mit "echo neue.txt >> vorhandene.txt" sein ...

  • Ich möchte nach einem Ausdruck in einer Datei suchen und diesen dann ersetzen, aber irgendwie funktioniert bei mir nicht

sed -i "s/'smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key'/'smtpd_tls_key_file=/etc/ssl/private/server.key'/g" /etc/postfix/main.cf

Der Tipp kam hier her: http://www.unixboard.de/vb3/showthread.php?46161-Sed-suche-nach-ausdruck-und-f%FCge-an&p=350467&viewfull=1#post350467

Danke!!!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17606

Wohnort: Berlin

dolfi56 schrieb:

Ich bräuchte noch mal eure Hilfe für folgende Befehle:

  • Suche nach "smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache" und füge dahinter in eine neue Zeile den Inhalt der Datei "addPostfix_ssl.txt" (inkl. Zeilenumbrüche) ein.

Das sieht mir doch langsam wie Hausaufgaben aus.

Du willst nicht selbst lernen, sondern nur hinter Dich bringen - stimmt's?

Solche Leute bekommen dann einen Schein, dass sie was können, was sie aber gar nicht können, und bauen dann Flughäfen die nicht fertig werden weil sie es nicht können.

dolfi56

(Themenstarter)

Anmeldungsdatum:
13. Mai 2014

Beiträge: 132

user unknown schrieb:

Das sieht mir doch langsam wie Hausaufgaben aus.

Du willst nicht selbst lernen, sondern nur hinter Dich bringen - stimmt's?

Solche Leute bekommen dann einen Schein, dass sie was können, was sie aber gar nicht können, und bauen dann Flughäfen die nicht fertig werden weil sie es nicht können.

falsch: ich bekomme dafür weder einen Schein noch verdiene ich daran was. und ich frage nur das nach, was ich selbst nicht weiß - wie du auch schon vorhere gesehen hast, probiere ich das alles selbst erst einmal durch und suche nach eienr Lösung. Wenn ich keine gefunden habe, darf ich doch nachfragen doer etwa nicht? Das ganze Script ist auch deutlich umfangreicher, als das, was ich hier nachfrage ...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17606

Wohnort: Berlin

dolfi56 schrieb: alsch: ich bekomme dafür weder einen Schein noch verdiene ich daran was. und ich frage nur das nach, was ich selbst nicht weiß - wie du auch schon vorhere gesehen hast, probiere ich das alles selbst erst einmal durch und suche nach eienr Lösung.

Dann pardon. Sah mir nicht sehr nach eigenen Versuchen aus. Zu wenig Schilderung was versucht wurde und was genau nicht klappte. Und die Probleme zeigen unnötige, konkrete Komplexität, die aber nicht das Problem ist.

  • Suche nach "xx" und füge dahinter in eine neue Zeile den Inhalt der Datei "a.txt" (inkl. Zeilenumbrüche) ein.

1
sed "/xx/r a.txt" ur.dat
  • Suche in der Datei "ur.dat" nach "xx" und ersetze den Inhalt der nächsten Zeile mit "foo" ab.

ab?

1
sed "/xx/a foo" ur.dat
  • Wie bekomme ich den Inhalt einer Datei (inkl. Zeilenumbrüche) in eine vorhandene eingefügt? Das muss ja irgendwas mit "echo neue.txt >> vorhandene.txt" sein ...

Vorletzte Frage.

  • Ich möchte nach einem Ausdruck in einer Datei suchen und diesen dann ersetzen, aber irgendwie funktioniert bei mir nicht

sed -i "s/'smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key'/'smtpd_tls_key_file=/etc/ssl/private/server.key'/g" /etc/postfix/main.cf

Zum Testen sind die Beispiele zu lang, und zu kompliziert. Man muss erst entschlüsseln was die Frage überhaupt ist, ob Tippfehler drin sind.

sed -i "s/ssl-cert-snakeoil.key/server.key/" /etc/postfix/main.cf

Das einfache Anführungszeichen ist m.E. das Problem, es wird Teil des Suchausdrucks. Ob die Kürzung nicht zu weit geht, weil ssl-cert-snakeoil.key mehrfach auftaucht musst du wissen.

1
sed s/foo/bar/ file 

funktioniert bereits, aber mit Leerzeichen schon nicht:

1
sed s/foo/b r/ file 

da muss es maskiert werden

1
sed "s/foo/b r/" file 

Anführungsstriche maskierst Du mit einfachen

1
sed 's/foo/b"r/' file 

Bei gemischten wird es langsam unübersichtlich.

Die Variable durch den Inhalt ersetzen kann man bei doppelten

1
sed "s/foo/$bar/" file 

als solche belassen mit einfachen Anführungszeichen.

1
sed 's/foo/$bar/' file 
1
sed s/foo/bar/g file 

das g steht für global und brauchst Du wenn Du in einer Zeile mehrfach ersetzen willst (alle).

Antworten |