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
Textdatei per Shell-Script ändern
Re: Textdatei per Shell-Script ändern
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.
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.
Re: Textdatei per Shell-Script ändern
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
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
Re: Textdatei per Shell-Script ändern
... 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!
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!
Re: Textdatei per Shell-Script ändern
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
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
Re: Textdatei per Shell-Script ändern
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'
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'
Re: Textdatei per Shell-Script ändern
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
#! /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