[sed] Znalezienie i doklejanie wzorca na początek kolejnych linii aż do wystąpienie kolejnego wzorca ...itd

Mam plik jak poniżej.

2018.07.01, Niedziela
09:27 jakis tekst 123456789 0 21 0,06 0,07 0,00
2018.07.02, Poniedziałek
09:31 jakis tekst 123456789 1 41 0,26 0,32 0,00
09:39 jakis tekst 456789012 1 0,07 0,09 0,09
09:45 jakis tekst 932469494 1 55 0,29 0,36 0,00
16:49 jakis tekst 123456789 0 48 0,12 0,15 0,00
20:13 jakis tekst 123456789 0 46 0,12 0,15 0,00

Chcę aby polecenie sed znalazło wzorzec YYYY.MM.DD, , Day of week ( Y - year, M-mont, , D-Day, np. 2018.07.01, Niedziela)

  1. skopiowało wzorzec do bufora
  2. usuneła wzorzec z danej linii a następnie
  3. wkleiło wzorzec do linii poniżej, tak aby uzyskać efekt poniżej.

2018.07.01, Niedziela 09:27 jakis tekst 123456789 0 21 0,06 0,07 0,00
2018.07.02, Poniedziałek 09:31 jakis tekst 123456789 1 41 0,26 0,32 0,00
2018.07.02, Poniedziałek 09:39 jakis tekst 456789012 1 0,07 0,09 0,09
2018.07.02, Poniedziałek 09:45 jakis tekst 932469494 1 55 0,29 0,36 0,00
2018.07.02, Poniedziałek 16:49 jakis tekst 123456789 0 48 0,12 0,15 0,00
2018.07.02, Poniedziałek 20:13 jakis tekst 123456789 0 46 0,12 0,15 0,00

Będę wdzieczny za konstruktywne wypowiedzi.

Działa poniższy sed.

sed -rn '/[0-9]{4}(.[0-9]{2}){2}, [[:alpha:]]+/ {h;n;}; H; x; s/\n/\t/; p; G; s/\n/\t/; s/(.)(\t.)\2/\1/; x; ’ file

Mam przed powyższym sed do wykonania wcześniej kilka innych sed jak poniżej.

s/^$/d/
/^[a-zA-Z]/d

Jak dodam rozwiązanie ninieszego zadania to niestety nie działa wywołanie sed jak poniżej.

sed -f reguly.sed plik

Jak umieścić tego wszystkie wywołania seda w pliku?

Dzięki.

Jedna mała uwaga. Czy przypadkiem kropka nie oznacza dowolnego znaku? To chciałeś osiągnąć?

Może spróbuj

\.

@nintyfan - w zasadzie powinna być kropka \. , niemniej dowolny znak . też robi robotę :slight_smile:

Odnośnie polecenia

sed -rn reguly.sed plik

Rozwiązałem zadanie w ten sposób: parametry do sed umieściłem w dwóch odddzielnych plikach (reguly1.sed oraz reguly2.sed). W pliku reguly1.sed znajdują się komendy do poniższej (do której sed działał zgodnie z moimi oczekiwaniami):

sed -rn '/[0-9]{4}(.[0-9]{2}){2}, [[:alpha:]]+/ {h;n;}; H; x; s/\n/\t/; p; G; s/\n/\t/; s/(. )(\t. )\2/\1/; x; ’ file

zaś kolejne w kolejnym pliku reguly2.sed. Całość łączy plik skryptu script.sc - skrót poniżej.

sed -rn -f reguly1.sed plik > temp
sed -rn -f reguly2.sed temp > wynik

Zauważyłem iż sed -rn nie działało prawidłowo gdy wyświetlałem linie po każdym warunku - nie wiem czy to lokalalna prawidłowość czy też łąd.