Shell-Programmierung

themok

Grünschnabel
Hi Leute!

Es geht um Befehle für die shell, die aus einem Makefile heraus gestartet werden. Das ist völliges Neuland für mich ... also folgendes:
Möchte aus ner Datei einen Integerwert a auslesen lassen, von dem ich nur die Position kenne, an der er steht, nicht aber die Größe. Und der soll durch a-1 ersetzt werden. Eigentlich ganz einfach. Also z.B.:

das ist die erste zeile
das ist die zweite zeile
das war 7 die zahl
resttext

und die 7 soll durch die 6 ersetzt werden.
 
Hallo,

solange du nur eine Zahl in deiner Zeile hast tuts das hier:

Bash:
#! /bin/sh
row_num=3
filename="test.txt"
number_to_search=$(cat $filename | head -$row_num | tail -1 | sed 's/[^0-9]//g')
sed -i -e "${row_num}s/$number_to_search/$(($number_to_search - 1))/" $filename

//edit: wenn sich der Fehlerteufel einschleicht :rolleyes:
Gruß

RedWing
 
Zuletzt bearbeitet:
Hi!

Vielen Dank erstmal! Also wenn ich das so in die shell eingebe, funktioniert das auch. Nur wenn ich das so aus dem Makefile aufrufe, passiert rein gar nix. Und wenn ich Klammern setze - also: $(number_to_search), kommt der Fehler:
sed: -e Ausdruck #1, Zeichen 0: no previous regular expression.

Aber ohne Klammern scheint er nach "umber_to_search" zu suchen. Die Zahl jedenfalls tauscht er nicht aus.
 
Hallo,

dann füg in dein Makefile mal folgende Regel ein:

Code:
filename: filename.txt
    row_num=3; \
    number_to_search=$$(cat $< | head -$$row_num | tail -1 | sed 's/[^0-9]//g'); \
    sed -i -e "$${row_num}s/$$number_to_search/$$(($$number_to_search - 1))/" $<

dann ein
Code:
make filename

Und es sollte funktionieren.

Gruß

RedWing
 
super, danke dir!

Eine letzte Frage. Mit der wc -l Funktion kann man ja die Zeilenzahl einer Datei ermitteln. Nur leider hängt da noch der string des Dateinamens dran. Wie krieg ich die Zeilenzahl als reinen Integerwert, damit ich mit dem weiterrechnen und den dann wieder in ne andre datei reinschreiben kann?

muchas gracias :-)
 
hallo red wing!

es funktioniert alles ... es läuft ... hab nochmal vielen dank!! Keine ahnung wie lange ich noch ohne deine hilfe gesessen hätte.

cu
 
Hallo,
themok hat gesagt.:
hallo red wing!

es funktioniert alles ... es läuft ... hab nochmal vielen dank!! Keine ahnung wie lange ich noch ohne deine hilfe gesessen hätte.

cu

Kein Problem, gern geschehen.
Aber der obige Code is noch nicht ganz korrekt. Wenn z.B. ein Wort
"22erw432" vorkommt dann gehts in die Hose.
Besser ist so:

Code:
filename: filename.txt
    row_num=3; \
    number_to_search=$$(cat $< | head -$$row_num | tail -1 | sed 's/.* \([0-9]\+\) .*/\1/'); \
    echo $$number_to_search; \
    sed -i -e "$${row_num}s/$$number_to_search/$$(($$number_to_search - 1))/" $<

Gruß

RedWing
 
Zurück