2017-10-05 1 views
0

Ich programmiere ein Bash-Skript, das ein-, zwei- und dreistellige Zahlen mit Nullen auffüllt. Zum Beispiel:Pad einstellige, zweistellige und dreistellige Zahlen mit Nullen mit sed

file.txt:

2 
22 
222 
2222 
a2a2 
2a2a 
a22a 
2aa2 
22a2 

output.txt:

0002 
0022 
0222 
2222 
a0002a0002 
0002a0002a 
a00022a 
0002aa0002 
0022a0002 

Der Zweck dieses Skripts ist es, die Ziffern zu füllen, bis sie maximal 4 Ziffern erreichen.

Ich muss es mit dem sed Befehl tun. Ich dachte darüber nach, es so zu machen, aber es funktioniert nicht so, wie ich es möchte.

sed -r -i 's/[0-9]{1}/0&/g' file.txt 
+2

'Ich muss es mit dem Befehl sed tun - warum? sed ist völlig das falsche Werkzeug für den Job. Es ist so, als müsste man einen Baum mit nur einem Schraubenzieher anpflanzen. –

+0

Diese Frage wird einmal pro Woche gestellt –

Antwort

3

GNU awk Lösung:

awk -v FPAT='[0-9]+|[^0-9]+' '{ 
      for (i=1;i<=NF;i++) printf ($i~/[0-9]/? "%04d":"%s"),$i; 
      print "" 
     }' file.txt 

Der Ausgang:

0002 
0022 
0222 
2222 
a0002a0002 
0002a0002a 
a0022a 
0002aa0002 
0022a0002 
+2

@ Mr.Kevin, viel Glück – RomanPerekhrest

+1

@ EdMorton, verbesserte Lesbarkeit, so dass es * eine Sekunde * schneller zu lesen) – RomanPerekhrest

3
$ sed -E 's/([[:digit:]]+)/000&/g;s/0+([[:digit:]]{4})/\1/g' file.txt 
0002 
0022 
0222 
2222 
a0002a0002 
0002a0002a 
a0022a 
0002aa0002 
0022a0002 

erster Wechsel wird vorangestellt 000 zu jeder Gruppe von Ziffern in der Zeile. Die zweite Substitution entfernt Nullen vom Anfang jeder Zifferngruppe, bis nur noch vier Ziffern übrig sind.

die Zwischenausgabe nach dem ersten Wechsel ist somit

$ sed -E 's/([[:digit:]]+)/000&/g' file.txt 
0002 
00022 
000222 
0002222 
a0002a0002 
0002a0002a 
a00022a 
0002aa0002 
00022a0002 

und der zweite Wechsel entfernt die zusätzlichen Nullen.

Verwandte Themen