sed? Zeichenkette ersetzen 1:2:17 zu 1:02:17

P

Programmer78

Doppel-As
Hallo,

ich ahne, dass sed wohl meine Lösung bereitstellen kann, aber weiss nicht, wie ich hierzu damit arbeiten muss.

Es dreht sich um Metadatenangabe in HTML, die Dauer eines Videos: Im HTML-Code steht zum Beispiel
Code:
<meta itemprop="duration" content="PT1H2M17S">

welches ich mit

Code:
egrep -o "itemprop=\"duration\" content=\"PT.?H?.?.M.?.S\"" /dev/shm/temp.html | cut -d \" -f 4 | sed 's/PT//;s/H/:/;s/M/:/;s/S//'

herausfiltere.

& in sed hilft mir da irgendwie nicht weiter.

Code:
echo "PT1H2M43S" | sed 's/PT//;s/H/:/;s/M/:/;s/S//'
zum rauskopieren und testen.

Also es soll eine Zeit im üblichen Format dargestellt werden.
2:07:11 statt 2:7:11
1:08:44 statt 1:8:44 und auch am Ende
1:27:07 statt 1:27:7

Da stehe ich jetzt auf dem Schlauch.

Danke für eure Anregungen.

Gruß

P.
 
Ich würde ein printf benutzen, z.B. von awk:
Code:
echo "PT1H2M43S" | sed 's/PT//;s/H/:/;s/M/:/;s/S//' | awk -F ':' '{printf "%d:%.2d:%.2d\n",$1,$2,$3}'
 
Hier die Variante, dass nur mit einem awk-Aufruf zu erledigen. Also nix neues, nur ein bisschen effizienter:

Code:
echo "PT1H2M43S" | awk '{a=gensub(/PT|H|M|S/," ","g",$0);split(a,b," ");printf "%d:%.2d:%.2d\n",b[1],b[2],b[3]}'
 
Super, funktioniert beides.

Im Manual von printf steht wenig dazu drinnen, da ist awk schon ausführlicher. So wie es aussieht, muss ich mich mal näher damit beschäftigen, da scheint doch einiges möglich zu sein. Bisher habe ich mich immer vor awk gedrückt, außer diese ganz einfachen Sachen.

Ich danke euch für die Lösungen!
 
Ok, es gestaltet sich doch noch komplizierter.

Für das Stundenformat funktioniert es zwar, habe aber gerade festgestellt, dass das Meta-Format sich ändert, bzw. wusste ich es vorher, wie es an der grep-Regex zu erkennen ist. Jedenfalls funktioniert es nur im Stundenformat.

Code:
<meta itemprop="duration" content="PT1H2M17S"> (Stundenformat)
<meta itemprop="duration" content="PT2M17S"> (Minutenformat)
<meta itemprop="duration" content="PT0M21S"> (Sekundenformat)

Also ich würde jetzt die Zahlen vor H M und S herausgreppen und diese in eine Variable speichern. Je nachdem was an den Buchstaben "HMS" vorhanden ist, dieses zusammenfügen, alles einzeln. Mit der Hilfe von akw oder printf dann jeweils die 0 hinzufügen obwohl es auch ohne ginge, so eine if Verschachtelung.

Kann man das optionale Vorkommen wie bei grep mit ? auch bei awk oder printf umsetzen?

mhh oder einfach IF --> wenn H vorkommt, dann ...
Code:
awk -F ':' '{printf "%d:%.2d:%.2d\n",$1,$2,$3}'
sonst
Code:
awk -F ':' '{printf "%.1d:%.2d\n",$1,$2}'
FI

Geht es einfacher?
 
Programmatisch ausgedrückt wäre dass dann so etwas:

Code:
echo "1 2 3" | awk '{
          if($3=="") {
               printf("%.1d:%02d\n",$1,$2);
          } else {
               printf("%.1d:%02d:%02d\n",$1,$2,$3);
          }
}'

Leerzeichen und Newlines sind syntaktisch falsch und nur der Übersichtlichkeit wegen eingefügt. Zur Ausführung diese Form verwenden:

Code:
echo "1 2 3" | awk '{ if($3==""){printf("%.1d:%02d\n",$1,$2);}else{printf("%.1d:%02d:%02d\n",$1,$2,$3);} }'


P. S.: Die volle Dokumenation zu printf gibt's hiermit: man 3 printf Das ist die ursprüngliche C-Variante von printf. In den davon abgeleiteten Funktionen der anderen Sprachen ist es meist nicht so genau beschrieben.
 
Zuletzt bearbeitet:

Ähnliche Themen

Tuxedo OS 1: Betriebssystem auf Basis von Ubuntu 22.04 aus Deutschland (2. Update)

Creative Labs SoundBlaster Audigy 2 ZS unter Debian / Kernel 3.16

Zeilen kopieren mit SED

Gnome Classic Desktop: Home-Inhalt Icons ausblenden

Fedora 20 - Unlösbare Paket-Duplikat Konflikte

Zurück
Oben