Teil einer Textzeile auswerten

Teil einer Textzeile auswerten

Ich habe einen Ausdruck der Form @(<date calculation>), den ich durch das Ergebnis von ersetzen möchte . So würde date +%s --date "now<date calculation>"beispielsweise durch das Ergebnis von ersetzt werden .@(-1 day)date +%s --date "now -1 day"

Der Ausdruck ist in eine Textzeile eingebettet und ich kann mehrere haben. Zum Beispiel echo hi @(-1 day) bye "@(-1 hour)". Das Ergebnis der Auswertung sollte etwa so aussehen echo hi 1491848561 bye "1491931365". Ich möchte also, dass nur der Ausdruck ausgewertet wird, sonst nichts.

Ich habe versucht, den GNU-Befehl sed „e“ zu verwenden:, sed -r 's|@\(([^)]*)\)|date +%s --date "now\1"|e'dieser wertet jedoch die gesamte Zeile aus, nicht nur den ersetzten Ausdruck.

Ich bin nicht an die Verwendung von sed gebunden, daher ist jeder andere Vorschlag willkommen, aber ich bin neugierig, wie man sed zum Laufen bringt, für allgemeines Wissen

Antwort1

Soweit ich weiß, eübergibt der GNU-Modifikator sed immer den gesamten Musterraum an die Shell - und diese Shell ist immer/bin/sh

Vielleicht haben Sie mehr Erfolg mit perl- zum Beispiel

$ echo 'For example echo hi @(-1 day) bye "@(-1 hour)"' | 
    perl -pe 's/@\((.*?)\)/sprintf "%s", $d = `date +%s --date "now $1"`, chomp $d/ge'
For example echo hi 1491874845 bye "1491957645"

(Im Gegensatz zu scheint sedder perl eModifikator das nachfolgende Newline nicht aus der Ausgabe des Shell-Befehls zu entfernen – daher das chomp).

Wenn Sie es jedoch verwenden möchten, perlist es wahrscheinlich vorzuziehen, eines der verfügbaren Module zur Datumsmanipulation zu verwenden - zum Beispiel

$ echo 'For example echo hi @(-1 day) bye "@(-1 hour)"' | 
    perl -MDate::Manip=ParseDateDelta,UnixDate -pe 's/@\((.*?)\)/UnixDate(ParseDateDelta($1), "%s")/ge'
For example echo hi 1491875065 bye "1491957865"

verwandte Informationen