2016-09-21 2 views
-3

Ersetzen sehr in der Nähe von String in eine Zahl durch eine andere ZeichenfolgeErsetzen Sie ganz in der Nähe Wort an eine Nummer mit einem anderen Wort

a b c d a b c d e 23:12:00 k b c l d b d c e 12:02:10 

Wie zuerst d, bevor die Zeit (Zahl) mit einem anderen Charakter f.it ersetzen sollte wie unten sein

a b c d a b c f e 23:12:00 k b c l d b f c e 12:02:10 

OR,

Wie mit Kopfzelle zu ersetzen.

[[email protected] ~]$ grep -oP '(cell">)[0-2][0-9]+:[0-9]+:[0-9]+' test.html1 
cell">06:25:50 
cell">23:59:38 
cell">23:17:50 
cell">06:27:37 
cell">06:07:38 

sollte es sein, wie unten

header ">06:25:50 
    header ">23:59:38 
    header ">23:17:50 
    header ">06:27:37 
    header ">06:07:38 
+0

Auch, was ist die Regel? 'sed 's/d/f/2'' macht, was Sie verlangen, wird aber im allgemeinen Fall wahrscheinlich nicht geeignet sein. – tripleee

+0

Die beiden durch ** ODER ** getrennten Problemaussagen sind völlig unterschiedlich. – anishsane

+0

beide sind .different. wenn die erste nicht möglich ist, dann wird die zweite verwendet –

Antwort

1

Nach Lösung für eine beliebige Anzahl suchen und gefunden, wenn wird es Abfrage starten rückwärts d in der Zeichenfolge zu suchen und wenn es gefunden ersetzen mit b.

Probeneingang:

echo $x 
a b c d a b c d e 23:12:00 k b c l d b d c e 12:02:10 

Lösung mit awk:

echo $x |awk '{for(i=1;i<=NF;i++) if($i ~/[0-9]|-[0-9]/) for(j=i;j>=0;j--) if($j ~/d/) {gsub(/d/,"b",$j);break }}1' 
a b c d a b c b e 23:12:00 k b c l d b b c e 12:02:10 
+0

Dank. Arbeiten perfekt in allen Fällen. wenn ich unter 20:00:00 ändern will, sollte ergebnis sein abcdabcde 23:12:00 kbcldbbce 12:02:10 –

+0

Auch wenn es in -ve ist, wie -39: 00: 00, sollte es ändern –

+1

@ SrinivasNallapati, versuche es jetzt mit negativen Zahlen. hat einige kleine Änderungen im Kommando gemacht. –

1

Dies könnte für Sie arbeiten (GNU sed):

sed -r 's/d([^d:]*([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])/f\1/g' file 

und

sed -r 's/cell(">([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])/ header \1/' file 

Beide Regexp-Muster übereinstimmen und dann Rückverweise auf der Ersatzseite der Substitution verwenden.

+0

Danke Potong.Es funktioniert gut. Wenn ich Linien ändern möchte, die weniger als 24:00:00 haben, dann wie kann ich Limit geben –

+1

@SrinivasNallapati siehe bearbeiten – potong

+0

Danke für die Antwort. Dadurch können wir nicht ändern 19:00:00 .Bei Ihrem Befehl können wir 01,02,03 aber nicht 04 ändern. Bitte schlagen Sie –

Verwandte Themen