Wie kann das erste Zeichen aller Zeichenfolgen in einer Datei gelöscht werden?

Wie kann das erste Zeichen aller Zeichenfolgen in einer Datei gelöscht werden?

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 \1ruft 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

verwandte Informationen