Hallo Liste, aus man sed werd ich nicht schlau. Ich habe ein Ascii-file in dem viele Zeilen wie stringA = stringB stehen. Nun möchte ich das =-Zeichen durch eine fortlaufende Nummer ersetzen und davor noch einen gleichbleibenden string setzen. also: string stringA 1 stringB string stringC 2 stringD string stringE 3 stringF ... wie lässt sich das wohl bewältigen? Am besten wäre ein sed oder awk, dann kann ich noch was lernen. (kein perl !) Ich weiss, solche direkten Fragen sind schlecht, aber "man sed" hilft mir einfach nicht weiter und das schlaue Unixbuch liegt in der Firma. :( Vielen Dank, christian
Am Samstag, 17. November 2001 01:12 schrieb Christian Stuermer:
aus man sed werd ich nicht schlau.
Probieren geht über Studieren.
Nun möchte ich das =-Zeichen durch eine fortlaufende Nummer ersetzen und davor noch einen gleichbleibenden string setzen. also: string stringA 1 stringB string stringC 2 stringD string stringE 3 stringF
Hier ein paar ad hoc-Zeilen, die Dir weiterhelfen sollten:
num=1 echo "string1 = string2" | sed -e "s#=#$num#g" && num=`expr $num + 1` string1 1 string2 echo "string1 = string2" | sed -e "s#=#$num#g" && num=`expr $num + 1` string1 2 string2 echo "string1 = string2" | sed -e "s#=#$num#g" && num=`expr $num + 1` string1 3 string2
Jetzt mußt Du das ganze nur noch aus Deiner Datei catten. Das Voransetzen von string am Zeilenanfang würde ich in einem Durchlauf bewerkstelligen. Der Zeilenanfang ist "^", also:
echo "string1 = string2" | sed -e "s#^#string #" string string1 = string2
War's das? - Matthias -- LPI Level 1 Certified http://www.selflinux.de
Hallo Christian, Christian Stuermer (cheese@arrakis.htu.tuwien.ac.at) wrote:
Ich habe ein Ascii-file in dem viele Zeilen wie stringA = stringB stehen. Nun möchte ich das =-Zeichen durch eine fortlaufende Nummer ersetzen und davor noch einen gleichbleibenden string setzen. also: string stringA 1 stringB string stringC 2 stringD string stringE 3 stringF ... falk@lexx:~/t1$ cat foo.txt stringA = stringB stringC = stringD stringE = stringF falk@lexx:~/t1$ awk '{sub(/=/,++num);print "string "$0}' foo.txt string stringA 1 stringB string stringC 2 stringD string stringE 3 stringF falk@lexx:~/t1$
wie lässt sich das wohl bewältigen? Am besten wäre ein sed oder awk, dann kann ich noch was lernen. awk ist IMO gut geeignet dafür. :-)
(kein perl !) Warum nicht?
Vielen Dank, 8-)
-Falk
On 17 Nov 2001, Falk Friedrich wrote:
Hallo Christian,
Christian Stuermer (cheese@arrakis.htu.tuwien.ac.at) wrote:
-snip-
falk@lexx:~/t1$ cat foo.txt stringA = stringB stringC = stringD stringE = stringF falk@lexx:~/t1$ awk '{sub(/=/,++num);print "string "$0}' foo.txt string stringA 1 stringB string stringC 2 stringD string stringE 3 stringF falk@lexx:~/t1$
wie lässt sich das wohl bewältigen? Am besten wäre ein sed oder awk, dann kann ich noch was lernen. awk ist IMO gut geeignet dafür. :-) Coool, vielen Dank !
(kein perl !) Warum nicht?
Ich kann kein perl, und aus irgendeinem Grund mag ich es einfach nicht...
Vielen Dank, 8-)
Danke, christian
Hallo Christian, * Am 17.11.2001 um 01:12 Uhr schrieb Christian Stuermer:
Ich habe ein Ascii-file in dem viele Zeilen wie stringA = stringB stehen. Nun möchte ich das =-Zeichen durch eine fortlaufende Nummer ersetzen und davor noch einen gleichbleibenden string setzen. also: string stringA 1 stringB string stringC 2 stringD string stringE 3 stringF ...
hier eine weitere Lösung: #!/bin/bash i=1 while read Zeile; do echo "string ${Zeile/=/$((i++))}" done < foo.dat Jürgen -- Wenn man vom Feind gelobt wird, hat man irgendetwas falsch gemacht. / Registered Linux-User #130804 http://counter.li.org \ \ Linux Stammtisch Bremerhaven http://linux.hs-bremerhaven.de /
On Sat, 17 Nov 2001, Juergen Schwarting wrote:
* Am 17.11.2001 um 01:12 Uhr schrieb Christian Stuermer:
Ich habe ein Ascii-file in dem viele Zeilen wie stringA = stringB stehen. Nun möchte ich das =-Zeichen durch eine fortlaufende Nummer ersetzen und davor noch einen gleichbleibenden string setzen. also: string stringA 1 stringB string stringC 2 stringD string stringE 3 stringF ...
hier eine weitere Lösung:
#!/bin/bash
i=1 while read Zeile; do echo "string ${Zeile/=/$((i++))}" ^ muss das nicht // sein? done < foo.dat
Ausserdem: $ while read Z; do echo "${Z//=/$((i++))}"; done bash: i++: syntax error: operand expected (error token is "+") Kurz: $ for x in A B C D; do echo "string${x} = string${x}"; done \ | ( i=0; while read Z; do echo "${Z//=/$[i=i+1]}"; done ) (ach ja, ich ziehe $[] dem $(( )) vor... ist leichter lesbar ;) oder: $ for x in A B C D; do echo "string${x} = string${x}"; done \ | awk '{ sub("=",++i); print $0;}' (die erste Schleife erzeugt dabei jeweils einfach nur: stringA = stringA stringB = stringB stringC = stringC stringD = stringD ) -dnh -- 121: NOP Seiteneffektfreies Takte verbraten. (Ingo Augsten)
Hallo David, * Am 17.11.2001 um 20:13 Uhr schrieb David Haller:
On Sat, 17 Nov 2001, Juergen Schwarting wrote:
#!/bin/bash
i=1 while read Zeile; do echo "string ${Zeile/=/$((i++))}"
^ muss das nicht // sein?
done < foo.dat
nein - der einfache Slash sorgt dafür, daß nur das erste Gleichheitszeichen ersetzt wird. Mit zwei Slash's erfolgt eine globale Ersetzung. Da das Ausgangsmuster aber folgendermaßen vorgegeben war... stringA = stringB ..sollte ein einfacher Slash ausreichen (und ist ggf. sogar ein wenig performanter ;-)
Ausserdem:
$ while read Z; do echo "${Z//=/$((i++))}"; done bash: i++: syntax error: operand expected (error token is "+")
Läuft bei mir problemlos: $ echo "strA = strB" | while read Z; do echo "${Z//=/$((i++))}"; done strA 0 strB Könnte vielleicht an der Bashversion liegen $ bash --version GNU bash, version 2.05.0(1)-release (i386-suse-linux) Jürgen -- Sind Sie im Zweifel, murmeln Sie. Sind Sie in Schwierigkeiten, delegieren Sie. / Registered Linux-User #130804 http://counter.li.org \ \ Linux Stammtisch Bremerhaven http://linux.hs-bremerhaven.de /
participants (5)
-
Christian Stuermer
-
David Haller
-
Juergen Schwarting
-
Matthias Kleine
-
suse-linux@frodo.prima.de