[BASH-Skript] Wildcard gesucht zum sed-Kommando

A

aragon19

Grünschnabel
Hallo zusammen.
Habe ein Skript erstellt, was mir auf Dauer die Arbeit erleichtern soll.
#!/bin/bash
#programm mkdir.sh
# $1 == Anzahl Iterationen
# $2 == Art der Rechnung
# $3 == Art der Agglomeration

mkdir testcase_it$1_$2_$3

echo "Wie heißt das Parafile?"
read PARAFILE

echo "Wie heißt das Gitter?"
read GITTERFILE

echo "Bandwidth optimasation 1 oder 0?"
read OPTI

cp $GITTERFILE ./testcase_it$1_$2_$3/.
cp $PARAFILE ./testcase_it$1_$2_$3/.
FILE=./testcase_it$1_$2_$3/$PARAFILE

COMMENT1="Maximal time step number: [1:100000000] "
UNCOMMENT1="Maximal time step number: $1"
sed -i "s/$COMMENT1/$UNCOMMENT1/" $FILE


COMMENT9="Bandwidth optimisation (0\/1): [0 1]"
UNCOMMENT9="Bandwidth optimisation (0\/1): $OPTI"
sed -i "s/$COMMENT9/$UNCOMMENT9/" $FILE

emacs $FILE

In dem Fettgedruckten Teil möchte ich eine Zeile ersetzen, bzw die letzte Zahl. Nun weiß ich nicht, welche Zahl dort defaultmäßig steht. Aber wenn ich dort den * hinsetze, dann löscht er die Zahl nicht, sondern schreibt die neue einfach davor und hängt die alte Zahl an. Es soll aber nur die neue Zahl dort stehen.

Kann mir da einer weiterhelfen?

Danke schon mal im voraus.
Aragon19
 
Hi,

ich hab einen Moment gebraucht um zu verstehen was du willst, aber wenn ich dich richtig verstehe suchst du das hier:

Code:
COMMENT1="Maximal time step number: [0-9]*"

In dem Fall sind es keine Wildcards sondern regulaere Ausdruecke, da duerfte dein Denkfehler liegen.

mfg,
bytepool
 
In dem Fall macht er aber wieder denselben Fehler, dass er die alte Zahl hinten wieder ranhängt.
Er soll aber die komplette Zeile löschen und die neue dahinsetzen.

Habe jetzt eine Lösung gefunden, die aber sehr unschön aussieht. Außerdem behält er da den Zeilen einzug nicht bei.

COMMENT2=`cat $FILE|grep "MG description filename: "`
UNCOMMENT2="MG description filename: $2"
sed -i "s/${COMMENT2}/${UNCOMMENT2}/" $FILE


Also wenn jemand was eleganteres hat, ohne grep, dann bin ich darauf gespannt.
Aragon19
 
Also, wenn ich das richtig verstehe, hast du in den Eingangsdateien irgendwelche Parameter mit den zulässigen Bereichen bzw. Werten zwischen '[' und ']' aufgeführt, und willst per sed jeweils die möglichen Werte durch die aktuellen ersetzen (und dabei die Klammern gleich mit los werden?).

Das könnte etwa so laufen:
Code:
COMMENT1="\(Maximal time step number:\) \[.*\]"
UNCOMMENT1="\\1 $1"
sed -e "s/$COMMENT1/$UNCOMMENT1/" $FILE

Wenn das nicht funzt, wäre evtl. hilfreich, wenn du ein konkretes Beispiel (Eingabe und was hinten rauskommen soll) hier einkippst.

Gruss
 
So hier dann mal das komplette Skript.
Worauf ich hinaus will ist, dass ich nicht weiß, was nach dem Doppelpunkt für eine Zeichenfolge steht.
Er soll einfach die komplette Zeile löschen und die neue Zeile inklusive meiner Variable einsetzen.
So wie es da jetzt steht funktioniert es, aber es muss doch auch eleganter gehen.
Aber bei allen anderen Lösungen, schreibt er immer noch die alte Zeichenfolge ans Ende.

#!/bin/bash
#programm tauprozessing.sh

# $1 == Anzahl Iterationen
# $2 == Art der Rechnung
# $3 == Art der Agglomeration

mkdir testcase_it$1_$2_$3

echo "Wie heißt das Parameterfile?"
read PARAFILE

echo "Wie heißt das zu verwendene Gitter?"
read GITTERFILE

echo "Bandwidth optimisation 1 oder 0?"
read OPTI

#
# Wenn Anisotrope Agglomeration verwendet werden soll, dann soll er die drei zusätzlichen Parameter auch abfragen.
#

if [ "$3" = "ani" ]; then

echo "Surface Agglomeration Ratio (3/4): ?"
read SUR_RATIO

echo "Wallnormal Agglomeration Ratio (2/3/4): ?"
read WALL_RATIO

echo "Group Boundary mappings (0/1/2): ?"
read MAPP

WAY=1
else
WAY=2
fi

#
# Erstellen des Ordners und Kopieren der erforderlichen Dateien
#

cp $GITTERFILE ./testcase_it$1_$2_$3/.
cp $PARAFILE ./testcase_it$1_$2_$3/.
FILE=./testcase_it$1_$2_$3/$PARAFILE

#
# Parameterfile wird für die Berechnung vorbereitet
#

COMMENT1=`cat $FILE|grep "Maximal time step number: "`
UNCOMMENT1=" Maximal time step number: $1"
sed -i "s/$COMMENT1/$UNCOMMENT1/" $FILE

COMMENT2=`cat $FILE|grep "MG description filename: "`
UNCOMMENT2=" MG description filename: $2"
sed -i "s/$COMMENT2/$UNCOMMENT2/" $FILE

COMMENT9="Bandwidth optimisation (0\/1): [0 1]"
UNCOMMENT9="Bandwidth optimisation (0\/1): $OPTI"
sed -i "s/$COMMENT9/$UNCOMMENT9/" $FILE

#
# Wenn Anisotrope Agglomeration verwendet werden soll, dann werden die drei zusätzlichen Variablen in das Parameterfile eingetragen und startet anschließend das Preprocessing!
# Wenn Standard gerechnet wird, dann startet er gleich das Preprocessing.
#

if [ "$WAY" = "1" ]; then

COMMENT4="Surface Agglomeration Ratio (3\/4): [3 4]"
UNCOMMENT4="Surface Agglomeration Ratio (3\/4): $SUR_RATIO"
sed -i "s/$COMMENT4/$UNCOMMENT4/" $FILE

COMMENT5="Wallnormal Agglomeration Ratio (2\/3\/4): [2 3 4]"
UNCOMMENT5="Wallnormal Agglomeration Ratio (2\/3\/4): $WALL_RATIO"
sed -i "s/$COMMENT5/$UNCOMMENT5/" $FILE

COMMENT6="Group Boundary mappings (0\/1\/2) [0 1 2]"
UNCOMMENT6="Group Boundary mappings (0\/1\/2): $MAPP"
sed -i "s/$COMMENT6/$UNCOMMENT6/" $FILE

cd testcase_it$1_$2_$3
~/TAU/taudir_chaco/bin/ptau3d.preprocessing para log_$3
else
cd testcase_it$1_$2_$3
ptau3d.preprocessing para log_$3
fi

#
# Wenn beim Preprocessing keine Fehler aufgetreten sind, dann soll er nun den Solver starten
#

if [ -s log_$3.preprocessing.stderr ]; then

echo "Es hat einen Fehler beim Preprocessing gebengegeben"

else

ptau3d.turb2eq para log_$1_$2_$3

fi

emacs log_$1_$2_$3.solver.stdout

Trotzdem schonmal danke an alle Helfenden.

Der Aragon
 
Hast du die Zeilen in meiner letzten Nachricht mal ausprobiert??

Wenn dir die '['/']'-Klammern sowieso auch egal sind, und du einfach alles nach dem Doppelpunkt mit der Zahl in $1 ersetzen willst, sollte
Code:
COMMENT1="\(Maximal time step number:\) .*"
UNCOMMENT1="\\1 $1"
sed -e "s/$COMMENT1/$UNCOMMENT1/" $FILE
doch schon genau das tun, was du willst ...

Gruss
 

Ähnliche Themen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Bash Skript: [[: not found Fehler

NagiosGrapher 1.7.1 funktioniert nicht

MySQL-Abfrage an Variable übergeben

Zurück
Oben