URL: https://www.overclockers.at/coding-stuff/linux_sed_212864/page_1 - zur Vollversion wechseln!
ich bin gerade dabei ein shell-script zu schreiben wo ich unter anderem auch das start-script von apache modifizieren will. bis jetzt habe ich eigentlich immer nur eine zeile ändern wollen, nun sinds aber mehrere. bzw möcht ich ein paar zeilen an einer bestimmten stelle einfügen. das problem ist nun dass ich eben nicht weiß wie ich eine weitere zeile darstelle und dass am anfang der zeilen auch tabs sind und ich nicht weiß wie ich diese bei der suche bzw beim einfügen darstellen soll.
was zurzeit funktioniert ist:
Code:sed -e 's/\tstart)/ersetzt/' /etc/init.d/apache2
Möchtest du den Text den es zu ersetzen gilt global (über das ganze Dokument hinweg) ersetzen?
Wenn ja dann häng beim subsitute noch /g dran. Also:
Code:sed -e 's/\tstart)/ersetzt/g' /etc/init.d/apache2
sowie ich es verstanden habe will er einen text über mehrere Zeilen an einer bstimmten stelle einfügen
Code:sed -e '10/TextTextText\nTextTextText/p' /etc/init.d/apache2
@lukas: das mit dem g am schluss ist mir schon klar. der text den ich suche, kommt aber eh nur einmal im dokument vor.
@dave: ja genau ich möchte einen text einfügen, aber ohne dabei eine konkrete zeilennr anzugeben, da sich die ja möglicherweise ändern kann. also soll das ganze dynamisch sein und zuerst den text suchen, wo ich dann meinen text dranhäng.
das
ist nur ein bsp gewesen.Code:sed -e 's/\tstart)/ersetzt/' /etc/init.d/apache2
aber da weiß ich eben nicht wie ich das in die suche miteinbeziehe...Code:log_daemon_msg "Starting web server" "apache2" if $APACHE2CTL start; then if check_htcacheclean ; then log_progress_msg htcacheclean start_htcacheclean || log_end_msg 1 fi
die zeilen per \n zu trennen geht nicht? Sollte eigentlich schon
Abgesehen davon, dass ich es fuer keine gute Idee halte, das Apache-Initscript zu verstuemmeln: Wieso nicht einfach ueber die Zeilennummer arbeiten?
Poste bitte sowohl die (vollstaendige) Datei, wie sie jetzt aussieht, und das Ergebnis, das du gerne generieren wuerdest. Dann finden wir sicher eine Loesung.
Uebrigens sollte der Thread "GNU - sed" heiszen
Also wenn ich nach "sed insert line" suche, kommt folgendes als erstes Ergebnis:
http://www.grymoire.com/Unix/Sed.html
ok also im moment sieht der abschnitt im apache-skript so aus:
(vor dem "start)" ist allerdings noch ein tab, welchen er hier aber anscheinend wegschneidet)Code:start) log_daemon_msg "Starting web server" "apache2" if $APACHE2CTL start; then if check_htcacheclean ; then log_progress_msg htcacheclean start_htcacheclean || log_end_msg 1 fi log_end_msg 0 else log_end_msg 1 fi ;;
Code:start) log_daemon_msg "Starting web server" "apache2" if $APACHE2CTL start; then if check_htcacheclean ; then log_progress_msg htcacheclean start_htcacheclean || log_end_msg 1 fi if [ ! -L /var/run/apache2.pid ]; then ln -s /chroot/var/run/apache2.pid /var/run/apache2.pid fi log_end_msg 0 else log_end_msg 1 fi ;;
also die erste Zeile und einen teil der 2ten zeile durch "dreck" auszutauschen, macht er gar nix. also findet es anscheinend nicht.Code:sed -e 's/\tstart)\n\t\tlog_daemon_msg/dreck/' /etc/init.d/apache2
funktioniert und "<tab>start)" wird mit "<tab>dreck" ausgetauschtCode:sed -e 's/\tstart)/\tdreck/' /etc/init.d/apache2
dann ersetzt er mir halt "start)", schreibt 3 leere zeilen und dann "dreck"Code:sed -e 's/\tstart)/\a\n\n\ndreck/' /etc/init.d/apache2
Ich hab grad nachgelesen und sed is line-based, also ist es etwas scheinbar komplizierter, in thats Link ist übrigens ein Kapitel darüber: http://www.grymoire.com/Unix/Sed.html#uh-47
Ich selbst würd's in dem Fall komplett anders angehen
* da ja start) unique ist (sein sollte)
* und wenn sich der Code zwischen start) und der Zeile die du einfügen willst ändert sowieso dein Pattern nicht mehr funktioniert
(wichtig)
Nimm die Zeilen die dazwischen stehen, mach ein md5, sha wwi Hash daraus, und aufschreiben.
In deinem Script selectest du genau die Zeilen per sed, awk, oder was du halt magst, generierst den Hash und vergleichst den. Wenn er übereinstimmt fügst du die Zeilen an start) + K ein (K muss konstant sein wenn der Hash stimmt)
Als nettes Nebenprodukt kannst du vor sed/awk schon einen Fehler ausgeben wenns nicht funktioniert.
Zitat von watchoutIch hab grad nachgelesen und sed is line-based, also ist es etwas scheinbar komplizierter, in thats Link ist übrigens ein Kapitel darüber: http://www.grymoire.com/Unix/Sed.html#uh-47
Ich meine aber multi-line patterns wären kompliziert (dahin führt auch der Link) also Patterns welche über ein \n hinausgehenZitat von thatDas passende Kapitel ist wohl dieses:
http://www.grymoire.com/Unix/Sed.html#uh-40
Und kompliziert ist das überhaupt nicht:
sed -e '/Suchbegriff/aDas hier kommt in eine neue Zeile nach dem Suchbegriff'
hmm danke auf jeden fall mal für die antworten!
das mitm hash klingt mir ein bissl zu kompliziert. vll mach ich das dann doch mit der zeilennr ^^ bzw nicht einfach nur die zeilennr angeben, sondern zeilennr von start + 7 oder so
also
+ 7Code:sed -n '/\tstart)/ =' /etc/init.d/apache2
Da du nicht sagst wozu du es brauchst: pfuschZitat von Zorrhmm danke auf jeden fall mal für die antworten!
das mitm hash klingt mir ein bissl zu kompliziert. vll mach ich das dann doch mit der zeilennr ^^ bzw nicht einfach nur die zeilennr angeben, sondern zeilennr von start + 7 oder so
also+ 7Code:sed -n '/\tstart)/ =' /etc/init.d/apache2
pfusch oder genehmigt?
ok aber dadurch dass "\tstart)" sowieso nur einmal vorkommen darf, müsste ein hashvergleich ja gar nicht notwendig sein oder?
Zitat von watchoutDa du nicht sagst wozu du es brauchst: pfusch
Du sollst ja nicht das start) hashen sondern das was zwischen start) und zeile +7 liegtZitat von Zorrok aber dadurch dass "\tstart)" sowieso nur einmal vorkommen darf, müsste ein hashvergleich ja gar nicht notwendig sein oder?
ich bin dabei ein skript zu schreiben, das automatisch einen webserver aufsetzt und grundlegende sicherheiteinstellungen vornimmt (chroot, modsecurity etc)
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025