2016-11-15 16 views
1

Ich versuche, einen Wert mit Variable mit Hilfe von sed und awk, aber nicht immer eine Ausgabe zu finden und ersetzen -Wie verwendet man Variable, um mit sed oder awk zu suchen und zu ersetzen?

#cat temp.txt 
this is Testing of date : 2016-11-25 07:20:10 

Es druckt die Variable aber nicht funktioniert in gsub-Funktion -

awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{print srch,repl}' temp.txt 
2016-11-25 07:20:10 [25/Nov/16:07:20:10] 

ich versuchte unter awk -

awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{gsub("srch","repl",$0)}' temp.txt 
awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{ gsub(srch,repl,$0)}' temp.txt 
awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{ gsub("$srch","$repl",$0)}' temp.txt 
awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{ gsub(srch,repl,$0)}' temp.txt 
awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{print gsub(srch,repl,$0)}' temp.txt 
awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{ gsub("srch","repl",$0)}' temp.txt 
awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{ gsub("$srch","$repl",$0)}' temp.txt 
awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{ gsub("$srch","$repl",$0)}' temp.txt 
awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{ gsub(srch,repl,$0)}' temp.txt 

#var1="2016-11-25 07:20:10" 
#var2="[25/Nov/16:07:20:10]" 
#echo $var1 $var4 
2011-11-25 07:20:10 [25/Nov/11:07:20:10] 
#awk -v srch="$var1" -v repl="$var4" '{ gsub(srch,repl,$0)}' temp.txt 

Mit sed Kommando -

#echo $var1 $var4 
2011-11-25 07:20:10 [25/Nov/11:07:20:10] 
sed 's/"$var1"/"$var4"/' temp.txt 
sed 's/$var1/'"${var4}"'/' temp.txt 
sed 's|$var1|'"${var4}"'|' temp.txt 
sed 's/\$var1/${var4}/' temp.txt 
sed 's/\$var1/$var4/' temp.txt 
sed "s/"$var1"/"$var4"/" temp.txt 
sed 's/'$var1'/'$var4'/' temp.txt 
sed 's/'$var1'/'$var4\/' temp.txt 
sed -e "s/${var1}/${var4}/' temp.txt 
sed -e "s/${var1}/${var4}/" temp.txt 
sed "s/$var1/$var4/" temp.txt 
sed 's/'"$var1"'/'"$var4"'/' temp.txt 
sed 's/'"$var1"'/'$var4'/' temp.txt 

Nicht sicher, was ich vermisse.

Erwarteter Ausgang -

#this is Testing of date : [25/Nov/11:07:20:10] 
+1

zumindest haben Sie etwas versucht :) –

Antwort

1

Es wäre:

var1="2016-11-25 07:20:10" 
var2="[25/Nov/16:07:20:10]" 
awk -v srch="$var1" -v repl="$var2" '{gsub(srch,repl)} 1' temp.txt 
sed 's#'"$var1"'#'"$var2"'#g' temp.txt 

Sie sollten auch Is it possible to escape regex metacharacters reliably with sed lesen, da das obige fehlschlagen würde, wenn var1 RE-Metazeichen oder var2 enthaltene Rückreferenzen enthalten würde.

2

diese funktioniert, aber Sie müssen print hinzuzufügen, oder es wird nichts gedruckt werden:

awk -v srch="2016-11-25 07:20:10" -v repl="[25/Nov/16:07:20:10]" '{ gsub(srch,repl,$0); print}' temp.txt 

Ergebnis:

this is Testing of date : [25/Nov/16:07:20:10] 

mit sed können Sie tun Sie es auch (solange Sie doppelte Anführungszeichen verwenden, oder Variablen werden nicht ausgewertet) , Aber da Ersatz-String Schrägstriche enthält, müssen Sie sed Ausdruck Trennzeichen ändern oder Sie einen Sed-Parsing-Fehler erhalten, wählte ich #

$ var1="2016-11-25 07:20:10"; var4="[25/Nov/11:07:20:10]" 
$ sed "s#$var1#$var4#" temp.txt 

Ergebnis:

this is Testing of date : [25/Nov/11:07:20:10] 
0

An ein bisschen eine Tangente - ich würde es in perl angehen und analysieren Sie Ihr Datum. (Ich weiß, dass Sie nicht über perl fragte, aber ich denke, es ist eine gute Passform für diese - es in den meisten Orten, die Sie sed oder awk zur Verfügung haben installiert ist)

Es wäre ein bisschen wie folgt arbeiten:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Time::Piece; 

#iterate __DATA__ special filehandle 
while (<DATA>) { 
    #extract time via regex 
    my ($time_str) = m/([\d\-]+\s+[\d\:]+)$/; 
    next unless $time_str; 
    #parse it into a Time::Piece object 
    my $timestamp = Time::Piece -> strptime ("$time_str", "%Y-%m-%d %H:%M:%S");  
    #print it using a new format string 
    my $new_time_str = $timestamp -> strftime("%d/%b/%y:%H:%M:%S"); 
    #replace old with new in line 
    s/$time_str/\[$new_time_str\]/; 
    #print current line 
    print; 
} 

__DATA__ 
this is Testing of date : 2016-11-25 07:20:10 

und im Interesse einer Lösung Befehlszeile, die in kondensiert:

perl -pe '($ts)=m/([\d\-]+\s+[\d\:]+)$/;s{$ts}{Time::Piece->strptime($ts,"%Y-%m-%d %H:%M:%S")->strftime("[%d/%b/%y:%H:%M:%S]")}e;' 

Sie Rohr in das kann, oder einen Dateinamen als Argument angeben, wie würden Sie mit sed oder awk.

Verwandte Themen