• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Stringübergabe...

Navigato

Newbie
Hallo,

ich habe volgenden Code mit dem ich nicht klar komme (... ja wieder :( )

Der Inhalt von VAR ist z.B.: Nov 2 13:00:00 hat also Leerzeichen.

Code:
set VAR = `cat $FILE.tmp | cut -b1-15`
set BEGIN_LINE = `grep -n $VAR $FILE | tail -1 | cut -d":" -f1`
echo $BEGIN_LINE

die Ausgabe ist folgende:
Code:
set BEGIN_LINE = `grep -n "$VAR" $FILE | tail -1 | cut -d":" -f1`
grep -n Nov 2 13:00:16 NSSovm_error.log
tail -1
cut -d: -f1
echo

Was ist daran Falsch???

Gruß
Navi
 

snaewe

Hacker
Wie wär's mit
Code:
set BEGIN_LINE = `grep -n "$VAR" $FILE | tail -1 | cut -d":" -f1`
(Jaja, wieder die " ...)


Stefan
 

snaewe

Hacker
Ach ja, bevor ich's vergesse (Hallo TeXpert):
Code:
set VAR = `cut -b1-15 $FILE.tmp`

SCNR

Stefan
 
OP
Navigato

Navigato

Newbie
so ich habe jetzt den fehler gefunden der mir einen strich durch die rechnung macht.

in meinem File steht folgendes:
Code:
Mar 14 13:00:00 ...
Mai  2 13:00:00 ...
nach der monatsangabe (ist immer 3stellig) sind 2 leerzeichen wenn die tagesangabe einstellig ist, sonst ist da nur ein leerzeichen.

ich lese in meine variable VAR zwar das datum mit zwei leerzeichen ein aber bei der ausgabe z.b. mit echo kürzt er ein leerzeichen weg. d.h. wenn ich mit der variablen weiter arbeite dann wird er dazu nichts finden da ein leerzeichen fehlt.

kann ich das irrgendwie umgehen oder abfangen??

MFG
Navi
 
OP
Navigato

Navigato

Newbie
hallo Stefan,

das problem ist folgendes

Code:
set VAR = `cut -b1-15 $FILE.tmp`
in diesem befehl schneide ich mir das datum raus aus einer datei das i $FILE.tmp noch so auschaut
Code:
Nov  2 13:00:00
wenn ich anschließend ein
Code:
echo $VAR
ausführe gibt er mir die gekürzte fassung zurück
Code:
Nov 2 13:00:00
:wink:
das ist mein problemchen
 

snaewe

Hacker
Navigato schrieb:
wenn ich anschließend ein
Code:
echo $VAR
ausführe gibt er mir die gekürzte fassung zurück
Code:
Nov 2 13:00:00
Ja, weil VAR drei 'Teile' (Wörter) enthält und echo jedes Wort getrennt durch ein Leerzeichen ausgibt. Also:
Code:
echo "$VAR"
Denn das übergibt genau ein Wort (welches Leerzeichen enthält) an echo. Du musst dir mal überlegen, wie in etwa echo implementiert ist (Falls Du C kannst):
Code:
...
int main(int argc, char* argv[])
{
...
for(int i=1;i < argc; ++i)
   printf("%s ", argv[i]);
...
}
Beim Aufruf 'echo $VAR' ist argv[1] == "Nov", argv[2] == "2" argv[3] == "13:00:00" - alles ohne Leerzeichen
Beim Aufruf 'echo "$VAR"' ist argv[1] = "Nav 2 13:00:00" und sonst nix.

EDIT: Wenn du einen C-Compiler installiert hast einfach gcc cmdline.c -o cmdline und z.B. ./cmdline `date` und ./cmdline "`date`"
Code:
#include <stdio.h>

int main(int argc, char* argv[])
{       size_t i=0;
        for(i=0; i<argc; ++i)
                printf("%d: %s\n", i, argv[i]);
        return 0;
}

Klaro?

Stefan
 
OP
Navigato

Navigato

Newbie
das ist mir schon klar soweit. darin liegt nicht die schwirigkeit. das problem ist ich brauche zwingend die eine zusätzliche leerstelle

was ich mit dem string eigentlich bezwecke ist folgendes ich muss überprüfen ob der string in einer datei vorhanden ist. und da stehen nun die einstelligen tagesangaben mit einem leerzeichen davor. sonst findet grep sie nicht

P.S. bist du lehrer?? gute erklärung!!
 

snaewe

Hacker
VAR enthält doch den vollständigen String (mit Leerzeichen). Lediglich
der Aufruf von echo bewirkt, dass der String an den Leerzeichen aufgebrochen und dann als einzelne Parameter an echo übergeben wird (was man ja mit echo "$VAR" umgehen kann). Du brauchst also nix weiter. Wenn du VAR mitsamt aller Leerzeichen mit grep oder wem auch immer weiterverarbeiten willst, dann übergib es einfach als "$VAR".
Oder reden wir aneinander vorbei ?

Stefan

P.S. Nix Lehrer...
 
Oben