
Beispiel meiner Textdatei:
03/Oct/2016:06:39:50-0500,cd/base/0/48/2.png,206,1514
03/Oct/2016:06:39:50-0500,cd/base/1/46/3.png,206,5796
03/Oct/2016:06:39:50-0500,cd/base/2/45/4.png,206,2252
03/Oct/2016:06:39:50-0500,cd/base/3/46/78.png,200,7208
03/Oct/2016:06:39:50-0500,cd/base/4/45/43.png,206,2252
03/Oct/2016:06:39:50-0500,cd/base/5/46/8.png,200,7208
...
In diesem Text muss ich die Zahlen nach base/
den folgenden Regeln ersetzen:
if that_number=0 then that_number=5
if that_number=1 then that_number=6
if that_number=2 then that_number=7
if that_number=3 then that_number=8
if that_number=4 then that_number=9
if that_number=5 then that_number=10
Gewünschtes Ergebnis:
03/Oct/2016:06:39:50-0500,cd/base/5/48/2.png,206,1514
03/Oct/2016:06:39:50-0500,cd/base/6/46/3.png,206,5796
03/Oct/2016:06:39:50-0500,cd/base/7/45/4.png,206,2252
03/Oct/2016:06:39:50-0500,cd/base/8/46/78.png,200,7208
03/Oct/2016:06:39:50-0500,cd/base/9/45/43.png,206,2252
03/Oct/2016:06:39:50-0500,cd/base/10/46/8.png,200,7208
Irgendeine Idee, wie ich das machen kann?
Antwort1
In Perl ist es einfach, sowohl den Kontext anzupassenUndführe die Addition durch:
perl -pe 's,base/\K\d+,$& + 5,e' input_file
Wir gleichen alles ab, was die Form hat , vergessen den ersten Teil (bis auf das ) und ersetzen den Rest durch das, was abgeglichen wurde ( ) plus 5. macht aus dem Ersatz einen Perl-Ausdruck anstatt nur einen String.base/<numbers>
\K
$&
e
Antwort2
awk
kann die Tatsache ausnutzen, dass es sich um eine +5
Operation für jede Zahl handelt:
awk -F'/' '{$5+=5 ; print}' OFS='/' input_file
Bei Verwendung /
als Feldtrennzeichen für Eingabe ( -F'/'
) bzw. Ausgabe ( OFS='/')
muss zu Feldnummer 5 eine 5 hinzugefügt werden.
Beachten Sie, dass hier die Position und Anzahl der Schrägstriche entscheidend ist.
Antwort3
sed
würde funktionieren:
sed \
-e 's/base\/1/base\/6/' \
-e 's/base\/2/base\/7/' \
-e 's/base\/3/base\/8/' \
-e 's/base\/4/base\/9/' \
-e 's/base\/5/base\/10/' \
-e 's/base\/0/base\/5/'
Ich glaube, Sie müssen den Fall „Basis/0“ ans Ende setzen, sonst greift auch der Fall 5 -> 10.