Wie kann das erste Zeichen aller Zeichenfolgen in der Datei gelöscht werden, wenn es Null ist?
z.B
Ich habe Datei
$ cat file
01111111 01222222 6666066
09999011 02222044 0743333
01000000 30000000 2222220
Versuchen Sie es mit der Ausgabe des sed-Befehls:
$ sed 's/^0*\(.*\)/\1/' file
1111111 01222222 6666066
9999011 02222044 0743333
1000000 30000000 2222220
Dadurch wird jedoch nur die Null in der ersten Spalte gelöscht.
So löschen Sie alle Nullen im ersten Zeichen einer Datei, z. B. Ausgabe:
1111111 1222222 6666066
9999011 2222044 743333
1000000 30000000 2222220
Antwort1
Es ist wahrscheinlich anzunehmen, dass eine Zeichenfolge in Ihrem Text durch Leerzeichen abgegrenzt ist. Wenn das der Fall ist, müssen Sie eine Null entfernen, wenn ihr ein Leerzeichen vorangestellt ist:
sed 's/\([[:space:]]\)0/\1/g'
Die \(...\)
Konstruktion speichert das Leerzeichen, das einer Null vorangeht, und \1
ruft beim Ersetzen den gespeicherten Text wieder auf.
Achten Sie dann auch auf führende Nullen:
sed -e 's/\([[:space:]]\)0/\1/g' -e 's/^0//'
Übrigens, Ihr Beispiel nichtlöschendie nicht anfänglichen Nullen, aber esersetztsie mit einem Leerzeichen. Meine Lösung geht von Löschung aus.
Außerdem ersetzt Ihre Lösung zum Ersetzen der führenden Null tatsächlich eine ganze Folge führender Nullen. Ihre Frage fragt jedoch nach derErsteNull zu löschen. Das macht meine Lösung.
Antwort2
Perl ist hierfür praktisch:
perl -lape 's/\b(0+)/" " x length($1)/ge' file
1111111 1222222 6666066
9999011 2222044 743333
1000000 30000000 2222220
Oder das Äquivalent in awk
awk '{while (1) if (gsub(/\<0/, " ", $0) == 0) break; print}' file
Beides verwandelt „0“ oder „00“ (als eigenständige Wörter) in bloße Leerzeichen.
Wenn Sie haben
$ cat file
01111111 01222222 6666066
09999011 02222044 0743333
01000000 30000000 2222220
00000007 00000009 0000000
Um die Nullwerte in der letzten Zeile beizubehalten, können Sie:
$ perl -lape 's/\b(0+)(\d)/" " x length($1) . $2/ge' file
1111111 1222222 6666066
9999011 2222044 743333
1000000 30000000 2222220
7 9 0