Textdatei per Shell-Script ändern

Post Reply
Message
Author
markr
Posts: 1
Joined: 04. Aug 2002 16:08
Contact:

Textdatei per Shell-Script ändern

#1 Post by markr »

Hallo Leute,

wie kann ich per Shell-Script eine Textdatei ändern? Bin leider noch Anfänger. Habe zuerst versucht, per Shell-Script vi aufzurufen, aber wie gelange ich dann wieder vom Eingabemodus in den Befehlsmodus. Escape ausführen geht wohl nicht oder? In der Datei muss nur eine bestimmte Zeile gesucht und ersetzt werden.

Vielen Dank für eure Hilfe im voraus.

Mark

hugenay

Re: Textdatei per Shell-Script ändern

#2 Post by hugenay »

sed oder awk ist hier das mittel der wahl.
Für einfaches ersetzen reicht sed, vor allem hier, wo vielleicht schon ein einzeiler hilft. Für Komplexeres eher awk, die manpages sind sehr gut. Sonst gibts auch nen haufen doku im netz, buecher aus papier sowieso.
gruss hug.

tj

Re: Textdatei per Shell-Script ändern

#3 Post by tj »

Hi,

Text ersetzen per awk mit einem Script 'replace' :

---------------------- snip ----------------
#! /bin/bash

command="`basename $0`"
usage="usage: $command <find-string> <replace-string>"

case $# in
2)
awk -v find="$1" -v repl="$2" '{gsub(find,repl); print; }'
exit;;
*) echo $usage; exit;;
esac

-------------------- snip ----------------

benutzen z.B. mit

cat oldfile | replace oldtext newtext > newfile


geht mit sed sicherlich eleganter, oder?

tj

MacOne

Re: Textdatei per Shell-Script ändern

#4 Post by MacOne »

... um nicht mit Kanonen auf Spatzen zu schiessen:

als Ausgangsbasis:

sed -e "s/REG_AUSDRUCK/IRGEND_WAS_ANDERES/" /tmp/x # gibt die Datei /tmp/x auf dem Bildschirm aus und ersetzt dabei
# REG_AUSDRUCK durch IRGEND_WAS_ANDERES
# Beachte: an der Datei wird nichts geändert!!!
cp /tmp/x /tmp/y
sed -e "s/REG_AUSDRUCK/IRGEND_WAS_ANDERES/" < /tmp/y > /tmp/x # macht das gleiche wie vorher, liest aber aus /tmp/y ein
# und schreibt das Ergebnis nach /tmp/y

was auch noch ganz nützlich ist:

sed -e '3d' /tmp/x # gibt die Datei /tmp/x auf dem Bildschirm aus und löscht dabei die dritte Zeile
# analog zu oben kann das ganze auch direkt auf die Datei angewandt werden

So und nun heissts sich mit regulären Ausdrücken und den Feinheiten vertraut machen <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Einfach mal in die Manpages kucken!

Descartes

Re: Textdatei per Shell-Script ändern

#5 Post by Descartes »

und wenn man direkt und ohne temporäre Dateien in einer Textdatei etwas ersetzen möchte kann man auch Perl verwenden das ja eh meist schon installiert ist.

Beispiel um in allen *.txt Dateien das Wörtchen "dies" zu ersetzen durch "das" wobei vor Änderungen von jeder Datei eine Sicherungskopie mit Dateiendung *.bak angelegt wird:

perl -npi.bak -e 's/dies/das/g' *.txt

Wer die Generierung der Sicherungsdateien unterbinden möchte, lässt einfach den Parameter "-i.bak" weg:

perl -np -e 's/dies/das/g' *.txt

Descartes

Re: Textdatei per Shell-Script ändern

#6 Post by Descartes »

Da hatte sich ein kleiner Fehler eingeschlichen.

Korrektur:
Wer die Generierung der Sicherungsdateien unterbinden möchte, lässt einfach bei dem Parameter "-i.bak" das ".bak" weg:
perl -npi -e 's/dies/das/g' *.txt

Das ganze kann man dann noch mit einem find Aufruf verbinden um gleich ganze Dateibäume zu bearbeiten:

find . -type f -name "*.txt" -print0 | xargs -0 perl -npi -e 's/dies/das/g'

MarkR.

Re: Textdatei per Shell-Script ändern

#7 Post by MarkR. »

Hab's nun hinbekommen. Hier das Ergebnis:

#! /bin/sh
#
#
#dieses Script ersetzt in der squid.conf die
#acl " zeit" durch eine neue mit einer anderen Zeit
#und startet Squid neu
echo ''
echo ''
echo ''
echo 'Bitte geben Sie die Anfangszeit an.'
echo 'Und beachten Sie dabei folgendes Schema:'
echo 'z.B. 08:00'
echo -n 'Anfangszeit: '
IFS=: read anfanghh anfangmm
echo -n 'Endezeit: '
IFS=: read endehh endemm

if [ "$anfanghh" -ge 0 -a "$anfanghh" -lt 25 -a "$anfangmm" -ge 0 -a "$anfangmm" -lt 60 -a "$endehh" -ge 0 -a "$endehh" -lt 25 -a "$endemm" -ge 0 -a "$endemm" -lt 60 ]
then

sed -e '
/acl zeit time/c\
acl zeit time SMTWHFA '$anfanghh':'$anfangmm'-'$endehh':'$endemm'
' < /etc/squid.conf > /home/temp/squid.conf

mv /home/temp/squid.conf /etc/squid.conf
rcsquid reload
echo ''
echo ''
echo ''
echo ''
echo 'Die Änderungen wurden vorgenommen.'
echo 'Die Teilnehmer dürfen nun von '$anfanghh':'$anfangmm'-'$endehh':'$endemm' im Internet surfen.'

else
echo ''
echo ''
echo ''
echo 'Bitte beachten Sie das vorgegebene Format!!'
echo 'Und geben Sie eine gültige Zeit ein.'
echo 'Wiederholen Sie den Vorgang.'
exit 1
fi
exit

Post Reply