Reichweite des Befehls cut in Unix

Reichweite des Befehls cut in Unix

Ich versuche, ein Shell-Skript zu erstellen. Ich möchte einen String mit dem Unix-Befehl „cut“ wie folgt ausschneiden:

namecmpaux=$(echo $namecmp |cut -c0-19)

Aber beim Ausführen zeigt die Shell den folgenden Fehler an:

cut: fields and positions are numbered from 1 
Try `cut - help 'for more information.

Ich erinnere mich, dass ich vorher den Befehl „cut“ mit Null als untere Grenzposition verwendet habe, aber jetzt bekomme ich die Meldung, dass der Befehl bei 1 beginnen soll. Warum? Hängt vom Betriebssystem ab? Früher habe ich SunOS verwendet und jetzt verwende ich Ubuntu 12.04

Antwort1

Nein, das ist in jeder Implementierung gleich cut. Zahlen beginnen bei eins, aber die Implementierung von Solaris beschwert sich nicht, wenn Sie 0 angeben, und behandelt es als 1. Sowohl 0und 1dort bedeutet das erste Zeichen als auch 2das zweite Zeichen:

$ echo test | cut -c 0-2
te
$ echo test | cut -c 1-2
te

busybox cutoder das cuteingebaute in, ksh93beschweren Sie sich auch nicht. GNU cutversucht nur, Ihnen zu helfen, indem es Ihnen sagt, dass Sie wahrscheinlich nicht die richtige Vorstellung davon haben, was der erste Index ist.

Ein echter Unterschied besteht jedoch darin, dass GNU und Busybox cut(zumindest seit 27.03.2014) in Bytes zählen -c, während Solaris oder ksh cutin Zeichen zählen (wie von POSIX gefordert).

$ echo 'Stéphane' | cut -c 1-4
Sté
$ echo 'Stéphane' | busybox cut -c 1-4
Sté
$ echo 'Stéphane' | ksh -c 'command /opt/ast/bin/cut -c 1-4'
Stép

(in einem UTF-8-Gebietsschema benötigt é (U+00E9) 2 Bytes)

Antwort2

Ja, das könnte tatsächlich vom Betriebssystem abhängen (oder eher davon, wer Ihre Version von geschrieben hat cut).

Wenn Sie einen Blick auf werfen man cut, werden Sie feststellen, dass cutGNU coreutilsBytes, Zeichen und Felder ab 1 zählt:

Verwenden Sie genau eines der folgenden Elemente: -b, -c oder -f. [...] Jeder Bereich ist eines von:
      N      N'tes Byte, Zeichen oder Feld, gezählt ab 1

Auch hier kann es auf einem anderen System anders sein, wenn sich dessen Betreuer für eine andere als die GNU-Implementierung entschieden haben cut. Gehen Sie also lieber auf Nummer sicher und werfen Sie zur Sicherheit einen Blick auf die Manpage.

Antwort3

Unter Linux hat es vorher sogar funktioniert. Ich wurde einfach davon genervt (unter Debian, nach einem Update des Coreutils-Pakets, das den Cut-Befehl enthält) und habe diesen Fehler gefunden.

Es ist ein Fehler in den Coreutils:

https://bugs.launchpad.net/ubuntu/+source/coreutils/+bug/211262

Jemand hat die Abwärtskompatibilität absichtlich kaputt gemacht und niemand hat es behoben. Früher war auch 0 in Ordnung und wurde als 1 behandelt. Jetzt erzeugt 0 einen Fehler. Alle Skripte, die von diesem Verhalten abhängen, sind also kaputt und müssen geändert werden.

verwandte Informationen