PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ein Datum in einer Datei ersetzen?



Pit
02-02-2005, 20:56
Hallo,

ich habe gerade ein mittelschweren Denkknoten und hoffe das Ihr mir auf die Sprünge bzw. zur Lösung helfen könnt.

Also, ich habe eine Datei in der zum Beispiel folgendes steht:
PREFERRED_VERSION_linux-libc-headers = "2.6.8.1"
PREFERRED_VERSION_gcc-cross-initial = "3.4.3"
PREFERRED_VERSION_mcp= "cvs-20050112"
PREFERRED_VERSION_joe = "3.1"

In der fettgedruckten Zeile möchte ich jetzt gerne per Script das Datum auf das von heute setzen. Habt Ihr eine Idee wie man das realisieren könnte? Bin für jeden Tip, jeden Codesnipsel sehr dankbar!

Gruss
Pit

peschmae
02-02-2005, 21:59
sed #PREFERRED_VERSION_mcp=.*#PREFERRED_VERSION_mcp=\"$(date +%Y%m%d)\"# -i datei.txt


macht z.B. sowas.

MfG Peschmä

Hans-Georg Normann
02-02-2005, 22:25
Peschmae war schneller, dafür hab ich mal wieder mein Lieblingsprogramm quälen dürfen ;)

# script kv_sourcefile.awk
# 02.02.2005 H.G. Normann
#

// kv_line()

BEGIN {
oFile=sprintf("%s.%s","/tmp/kv_sourcefile",ENVIRON["LOGNAME"])
fSearch="PREFERRED_VERSION_mcp"
fLength=length(fSearch)

fDate=strftime("%Y%m%d")

fStr=sprintf("/bin/cp /dev/null %s", oFile)
system(fStr)

printf("%-20s = %s\n","oFile",oFile)
printf("%-20s = %s\n","fSearch",fSearch)
printf("%-20s = %d\n","fLength",fLength)
printf("%-20s = %s\n","fDate",fDate)
printf("%-20s = %s\n","cmd",fStr)
printf("\n\n\n\n")
}

END {
fStr=sprintf("/bin/cp %s %s",oFile, FILENAME)
system(fStr)
}


function kv_line() {
fStr = substr($0,1,fLength)
if(fStr==fSearch)
{
printf("%s = \"cvs-%s\"\n",fSearch,fDate)>oFile
}
else
{
printf("%s\n", $0)>oFile
}
}Nehmen wir an, das script heist kv_sourcefile.awk und die zu konvertierende Datei sourcefile dann ist der Aufruf:
awk -f kv_sourcefile.awk sourcefile

Wie werden eigentlich in Regex Suchmuster negiert? Dadurch könnte man das script noch wesentlich einfacher gestalten.

Hans

Hans-Georg Normann
03-02-2005, 00:17
Ich wusste doch, dass man das noch verkürzen kann. :) So kann dann wahrscheinlich jeder dieses Script nach Belieben erweitern.
# script kv_sourcefile.awk
# 02.02.2005 H.G. Normann
#

/PREFERRED_VERSION_mcp/ { kv_line() }
// { do_nothing() }

BEGIN {
#Ausgabedatei festlegen
oFile=sprintf("%s.%s","/tmp/kv_sourcefile",ENVIRON["LOGNAME"])

fProcessed=0
fDate=strftime("%Y%m%d")

#Ausgabedatei leer anlegen
fStr=sprintf("/bin/cp /dev/null %s", oFile)
system(fStr)

#Kontrollausgabe
printf("%-20s = %s\n","oFile",oFile)
printf("%-20s = %s\n","fDate",fDate)
printf("\n\n\n\n")
}

END {
#Ersetze Originaldatei durch Ausgabedatei
fStr=sprintf("/bin/cp %s %s",oFile, FILENAME)
system(fStr)
#Lösche Ausgabedatei
fStr=sprintf("/bin/rm %s", oFile)
system(fStr)
}


#Zeile mit Ersetzung ausgeben
function kv_line() {
printf("%s = \"cvs-%s\"\n","PREFERRED_VERSION_mcp",fDate)>oFile
fProcessed=1
}

#Zeile ohne Ersetzung ausgeben
function do_nothing() {
if (fProcessed > 0) {
fProcessed=0
return
}
printf("%s\n", $0)>oFile
}
Hans

Pit
03-02-2005, 08:23
Hey super, vielen Dank Euch beiden. Ihr habt mir sehr geholfen! Danke nochmals :)

MfG
Pit

Pit
03-02-2005, 11:58
sed #PREFERRED_VERSION_mcp=.*#PREFERRED_VERSION_mcp=\"$(date +%Y%m%d)\"# -i datei.txt


Leider wirft diese Befehlszeile nur einen Fehlermeldung aus :(... Das die Syntax nicht korrekt wäre... Eine Idee?

Gruss
Pit

peschmae
03-02-2005, 17:23
Was genau sagt es? Und was für ein Sed hast du?

MfG Peschmä

Pit
03-02-2005, 17:42
Hi,

Version: GNU sed Version 4.1.2 und es sagt:



Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
-l N, --line-length=N
specify the desired line-wrap length for the `l' command
--posix
disable all GNU extensions.
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
-u, --unbuffered
load minimal amounts of data from the input files and flush
the output buffers more often
--help display this help and exit
--version output version information and exit

If no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret. All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.

Fehlerberichte (in Englisch!) per E-Mail an: bonzini@gnu.org .
Verwenden Sie dabei den Begriff ``sed'' irgendwo in der ``Betreff:''-Zeile.

peschmae
03-02-2005, 18:54
Das tönt ok. Was für eine Shell verwendest du?

MfG Peschmä

Pit
03-02-2005, 19:31
Danke für Deine Geduld! Version ist folgende:

GNU bash, version 3.00.16(1)-release (i386-pc-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.


Gruss
Pit

peschmae
04-02-2005, 08:16
Dann muss (tm) das einfach gehen. Schliesslich gings bei mir auch. Und ich hab recht ähnliche Versionen in Verwendung.

Wenn ich zuhause bin und ne anständige Shell vor mir habe schreib ich dir sonst noch eine oder zwei Varianten davon, die evtl. gehen. :)

Kannst du eventuell mal den


\"$(date +%Y%m%d)\"

-Teil rausnehmen und gucken ob es so geht? d.h. die Zeile mit dem Datum sollte dann einfach so ersetzt werden dass das Datum weg ist.

MfG Peschmä

Pit
04-02-2005, 11:09
Hi peschmae,

bekomme wiederhin die Syntaxmeldung.

Gruss
Pit

peschmae
04-02-2005, 14:24
argl. Schande über mich. Da ist ein s verloren gegangen:

sed s#PREFERRED_VERSION_mcp=.*#PREFERRED_VERSION_mcp=\"$(date +%Y%m%d)\"# -i datei.txt

statt


sed #PREFERRED_VERSION_mcp=.*#PREFERRED_VERSION_mcp=\"$(date +%Y%m%d)\"# -i datei.txt

das wird im Forenbeitragfenster so blöd umgebrochen das ich wohl gedacht habe da sei noch ein Enter drin und dabei das s gelöscht habe :D

MfG Peschmä

Pit
04-02-2005, 14:26
Hi peschmae,

1000 Dank werde es leider erst später testen können, werde dann aber berichten. Danke für Deine unermüdliche Hilfe!

Gruss
Pit

Pit
04-02-2005, 19:06
Hi peschmae,

wenn ich nun den Befehl eingebe dann erhalte ich in der Shell ein ">" und kann weitere Sachen eingeben. Abbrechen muss ich mit "Strg+C"... Mache ich da einen Denkfehler?!

Gruss
Pit

peschmae
05-02-2005, 06:41
Da ist das Forum schuld dran nicht ich. In dem Bereich _mcp=\ "$(date fügt das FOrum zwischen dem Backslash \ und dem " Leerzeichen ein. In der Editier-Ansicht sind die nicht da. Wenn du die rausnimmst sollte es gehen.

MfG Peschmä

Pit
05-02-2005, 10:12
:eek: Unglaublich, hätte mir auch auffallen können... Jaja, immer das kopieren einfügen, das sorgt schon öfter mal für Fehler... Nun rennt es perfekt!

Danke und ein schönes WE noch :)!

Danke,
Pit