# Shell-Programmierung



## themok (12. April 2006)

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.


----------



## RedWing (12. April 2006)

Hallo,

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


```
#! /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  
Gruß

RedWing


----------



## themok (12. April 2006)

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.


----------



## RedWing (12. April 2006)

Hallo,

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


```
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 

```
make filename
```

Und es sollte funktionieren.

Gruß

RedWing


----------



## themok (12. April 2006)

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


----------



## themok (12. April 2006)

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


----------



## RedWing (12. April 2006)

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:


```
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


----------

