Zeichen ersetzen in einer Datei??

E

ebi-dirk

:hilfe2:
Hallo,

bin total neu hier und auch auf dem Gebiet vom Shellscript bin ich noch total unerfahren.

Habe eine Datei in der an der dritten Stelle einer Zeile eine Monatsabkürzung steht wie Jan Feb oder Mar usw. Diese Monatsabkürzung würde ich gerne durch die passende Monatszahl ersetzen wie 01 02 03 usw.

Weiss aber leider nicht wie ich das machen kann.

Kann mir da jemand weiterhelfen?

Vielen Dank Dirk

:hilfe2:
 
Mar usw. Diese Monatsabkürzung würde ich gerne durch die passende Monatszahl ersetzen wie 01 02 03 usw.
Code:
sed -i 's/\bJan\b/01/' test.txt
wäre ein Vorschlag. Das ersetzt ein alleine stehendes "Jan" durch "01" in einer Zeile wie "ab Jan Monat Januar", läßt das Wort "Januar" aber heile.
 
mit date: (geht aber nur mit einem datum pro zeile und auch nur mit den drei-buchstaben monatskürzeln (respektive es geht schon (wie man nachher auch im perlskript sieht) den "ganzen" (englischen) monatsnamen, aber dafür war ich jetzt mal zu "faul"...))
Code:
#!/bin/bash

while read line; do
    month=$(echo $line|egrep -io '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)')
    digitMonth=$(date -d"1${month}2000" +%m)
    echo $line|sed -e "s/$month/$digitMonth/g"
done
wobei man das umändern kann, wenns wirklich immer genau die dritte zeile der datei ist:
Code:
#!/bin/bash

INFILE=$1 # du musst den dateinamen als erstes argument übergeben

month=$(sed -ne '3p' $INFILE|egrep -io '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)')
digitMonth=$(date -d"1${month}2000" +%m)
sed -e "3s/$month/$digitMonth/g" $INFILE
also das erste kann(/muss/sollte) man in einer pipe verwenden, das zweite kannst(/musst) du "alleine" aufrufen, musst allerdings den dateinamen der zu verändernden datei als ersten parameter mit angeben.
ODER, wenn man nichts anderes zu tun hat hier eine lösung in perl:
Code:
#!/usr/bin/env perl

my %monthHash = (   'Jan(uary)?'    =>  '01',
                    'Feb(ruary)?'   =>  '02',
                    'Mar(ch)?'      =>  '03',
                    'Apr(il)?'      =>  '04',
                    'May'           =>  '05',
                    'June?'         =>  '06',
                    'July?'         =>  '07',
                    'Aug(ust)?'     =>  '08',
                    'Sep(tember)?'  =>  '09',
                    'Oct(ober)?'    =>  '10',
                    'Nov(ember)?'   =>  '11',
                    'Dec(ember)?'   =>  '12');

while(my $inp = <STDIN>)
{
    foreach my $mon (keys(%monthHash))
    {
        if ($inp =~ /$mon/i) {$inp =~ s/$mon/$monthHash{$mon}/ig}
    }
    print "$inp";
}
(woraus man schließen kann wieviel ich ungefähr zu tun hab...)

edit: wobei halt die frage ist, wie "bullet-proof" die regexes beispielsweise sein müssen. ich bin mal davon ausgegangen, dass in der zeile nicht sonderlich viel mehr außer dem monat(skürzel) steht. also probier meine sachen lieber nicht mit zeilen wie:
Jan thought, that marching was actually fun, though he preferred the use of octal numbers above the widely spread use of decimals in breast-augmentation surgery; also he was beginning to feel his novicely skilled jungsters (on of them named jule) go septic.
mein perl-skript würde daraus folgendes machen:
01 thought, that 03ing was actually fun, though he preferred the use of 10al numbers above the widely spread use of 12imals in breast-08mentation surgery; also he was beginning to feel his 11icely skilled 06gsters (on of them named 07e) go 09tic.
wie jabo angemerkt hat wäre word boundaries mitmatchen da eine idee um dieses problem zu umgehen.
 
Zuletzt bearbeitet:

Ähnliche Themen

CSV Datei mit sed manipulieren/optimieren/ergänzen

Maskiertes Suchen, Ersetzen und Rechnen in access.log vor weitere Bearbeitung

marke durch datei mit sed ersetzen

cannot open /dev/ttyACM0: invalid argument

OpenVPN Zertifikate

Zurück
Oben