Login


 
Newsletter
So, 12. März 2000, 21:16

Gegenstück zu nl

Ich habe ein kurzes Listing gebastelt, das Listings aus elektronischen Dokumentation recht einfach (ohne abzutippen, ich bin faul) von den nervigen Zeilenummerierungen befreit.

Es ist sozusagen das einfache Gegenstück von nl. Das Beispiel habe ich für einen C++ Kurs geschrieben, aber der Compileraufruf kann ja relativ leicht ersetzt werden.

#!/bin/bash
# Tool, um von vorgegebenen Listings (z. B. in HTML Dokumentationen) die
# Zeilenzahlen samt Doppelpunkt zu entfernen und anschließend gleich zu
# kompilieren.
# Das ganze Listing mit linker Maustaste markieren und mit mittlerer
# Maustaste einfügen. Und Spass...
# Ach ja, mensch sollte das ganze noch mit: chmod u+x grepterm
# im richtigen Vereichnis ausführbar machen.

if [ $# -lt 1 ]
then
 echo "Aufruf: grepterm Dateiname"
 exit 1
fi
echo -e "\n\nZum beenden 3! mal CTRL (STRG) und D drücken (EOF)\n\n"

> $1.C

cat </dev/ttysed -r -e "s,^[0-9]*:,," -e "s,^ +,,">>$1.C

g++ $1.C -o $1
# und hier wird der Kram gleich kompiliert

Und jetzt Erklärungen:

Am Anfang wird geschaut, ob weniger als ein Argument eingegen wurde, der Dateiname also vergessen wurde. $0 ist dabei der Aufruf: grepterm. Falls der Dateiname vergessen wurde, steigt es mit einer Fehlermeldung aus. Dann kommt eine Anweisung, wie das Programm zu handhaben ist. Leider ist mir da nichts besseres eingefallen. Vielleicht weiß da jemand etwas geschickteres?

Es wird eine Datei mit der Dateinamenserweiterung .C angelegt (war halt für einen C++ Kurs). Der Text sollte an dieser Programmstelle mit markieren und einfügen (linke Maustaste, mittlere Maustaste) in das gerade aktuelle Terminal eingefügt werden. Die Eingabe wird mit cat über eine Pipe an sed weitergegeben.

sed:

  • s bedeutet suchen und ersetzen
  • ^ bedeutet Zeilenanfang
  • der Ausdruck von Komma 1 zu Komma 2: eine Zahl
  • * bedeutet mindestens ein Zeichen, das durch den Ausdruck von Komma 2 zu Komma 3 (nichts) ersetzt werden soll
  • Nächster Ausdruck: Wenn am Anfang der Zeile mindestens ein Zeichen Whitespace, ersetze mit Nichts

Der ausgegebene Kram wird Zeile für Zeile in die angelegte Datei geschrieben. Zum Schluss noch der Compileraufruf, der die Datei in ein Programm umwandelt.

Und wenn man (viele) Listings als Dateien hat, kann man sie mit dem folgenden Skript von den Zeilennummern befreien:

#!/bin/bash
# grepc
# Kleines Tool, um von gespeicherten Listings die Zeilenzahlen samt Doppelpunkt
# zu entfernen.
# Ich gab dazu ein: grepc *.C (in Anlehnung an obiges grepterm; ich weiß,
# bescheuerter Name)

echo -e "\n Dateien zu bearbeiten: $# \n"
i=1
for arg in $@
# Damit sie einzeln behandelt werden
do
echo -e "\n Bin bei Datei $i: $arg"
# Aktueller Bearbeitugsstand

grep "[0-9]\:" $argsed -e "s,^[0-9]*:,," -e "s,^ +,,"

# grep: $arg entspricht dem jeweiligen Dateinamen
# bei mir war es mit grep vor dem sed schneller

i=`expr $i + 1`
done

Am Ende könnte natürlich auch noch ein Compileraufruf wie oben eingebaut werden. Was also geschieht, ist, in einer for-Schleife die einzelnen (durch $@) Dateien wie im oben dargestellten Skript von den den Zeilennummern zu befreien. $i und seine Ausgaben sind eigentlich Schnickschnack, zeigt allerdings bei vielen Dateien, die wievielte man gerade bearbeiten lässt.

Kommentare (Insgesamt: 7 || Alle anzeigen || Kommentieren )
Re: Gegenstück zu nl (Olaf, Do, 16. März 2000)
Re: Gegenstück zu nl (Olaf, Do, 16. März 2000)
Re: Gegenstück zu nl (Olaf, Do, 16. März 2000)
Re: Gegenstück zu nl (Olaf, Do, 16. März 2000)
Re: Gegenstück zu nl (Anonymous, Mi, 15. März 2000)
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten