Wie verwende ich das Flag -p von BSD Split?

Handbuch

-p pattern
         The file is split whenever an input line matches pattern,
         which is interpreted as an extended regular expression.  The
         matching line will be the first line of the next output file.
         This option is incompatible with the -b and -l options.

Code

seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'

die eine Sequenz von 1 bis 10 erstellt, leere Zeilen entfernt, um einen Megastring zu erhalten, und dann at 060in zwei Dateien aufteilt, die erfolglos split: invalid option -- 'p'.

Befehl seq -w 1 1 10 | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'im Kommentar gibt

Feld1: 01 Feld2: 060 Feld1: 02 Feld2: 060 Feld1: 03 Feld2: 060 Feld1: 04 Feld2: 060 Feld1: 05 Feld2: 060 Feld1: 06 Feld2: 060 Feld1: 07 Feld2: 060 Feld1: 08 Feld2: 060 Feld1: 09 Feld2: 060 Feld1: 10 Feld2: 060

was ich nicht will. Ich möchte die Datei an der Markierung in zwei Dateien aufteilen 060. Sie können 060beide Dateien einschließen.

Wie können Sie das Flag -p in BSD Split in OSX verwenden?

Die Tatsache, dass Sie "ungültige Option" erhalten, deutet darauf hin, dass Sie möglicherweise nicht die richtige aufrufen split. Was kommt which splitzurück?
@mjturner Ich habe die Ausgabe Ihres Befehls hinzugefügt. Ja, es scheint, dass etwas in meinem System nicht stimmt. In meinem Handbuch man splitgeht es um BSD, während mein eigentliches splitum GNU geht.
Warum verwenden Sie nicht sowohl die Befehle seqals auch beim Ersetzen von ? Die Ausgabe der folgenden Befehle besteht aus zwei Zeilen, eine ist und die andere ist . Der Befehl lautet:gsedawksplitfield1: 0102030405field2: 0607080910seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'

Antworten (2)

Das Problem wird dadurch verursacht, dass der BSD-Split später in Ihrem Pfad liegt als der GNU-Split (der die Option nicht unterstützt -p). Wenn Sie dies tun, echo $PATHsollten Sie dies sehen - /usr/local/opt/coreutils/libexec/gnubinwird vorher /usr/binin der Ausgabe sein.

Um BSD Split direkt aufzurufen, verwenden Sie den vollständigen Pfad - pipe to /usr/bin/splitstatt split.

Ihr ursprünglicher Befehl wird dann zu:

seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'
Wie können PATH und MANPATH konsistent gesetzt werden, sodass es sich bei dem Befehl man splitum einen Befehl handelt split?
Wenn Sie möchten, dass die GNU-Befehle mit einem Präfix installiert werden, müssen Sie sie neu installieren. Sobald dies erledigt ist, ändern Sie Ihren PATH und MANPATH in Ihren Shell-Konfigurationsdateien entsprechend. Wie haben Sie die GNU-Befehle installiert? Ich habe das Gefühl, von Hand zu kompilieren - wenn ja, verwenden Sie lieber einen Paketmanager wie pkgsrc, MacPorts oder Homebrew. Viel besser als aus dem Quellcode zu kompilieren.
Was ist Ihre Ausgabe seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | /usr/bin/split -p '060'? Ich bekomme nur den Originalstring. Da hat sich gar nichts gespalten.
@Masi Das ist beabsichtigt. splitteilt eine mehrzeilige Datei unter Verwendung des -pMusters in mehrere Dateien auf. Da Sie nur eine einzige Eingabezeile verwenden, ist dies die Ausgabe. splitteilt keine übereinstimmende Zeile, sondern verwendet sie als Anfang der nächsten Datei. Das macht hoffentlich Sinn!
Ja, es macht Sinn. Ich habe Daten in einer Megaline. Was ist die Option zum Online-Split? Ich brauche diese Aufteilung online, da einige Inhalte aus zwei Zeilen bestehen können, bei denen ein Abgleich in mehreren Zeilen nicht funktioniert.
@Masi Sie müssen uns ein richtiges Beispiel geben, aber mit den bereitgestellten Daten können Sie Folgendes tun, anstatt zu leiten split:| awk -F'060' '{print "field1: "$1 "\nfield2: "$2}'
@mjturner, Ihr vorgeschlagener awkBefehl teilt die Zeichenfolge sozusagen, aber seine Ausgabe verwirft "060" (da es als Feldtrennzeichen festgelegt ist) aus der Zeichenfolge, und ich glaube, Masi möchte nicht, dass Daten verworfen werden. Wäre folgendes angemessen?awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
@ user3439894 Die Ausgabe ist field1: 01 field2: 060 field1: 02 field2: 060 field1: 03 field2: 060 field1: 04 field2: 060 field1: 05 field2: 060 field1: 06 field2: 060 field1: 07 field2: 060 field1: 08 field2: 060 field1: 09 field2: 060 field1: 10 field2: 060nicht das, was ich will. Ich möchte die Datei an der Markierung in zwei Dateien aufteilen 060. Sie können 060beide Dateien einschließen.
@Masi, ich weiß nicht, wie Sie all diese Felder erhalten, aber die Ausgabe der folgenden Befehle besteht aus zwei Zeilen, eine ist field1: 0102030405und die andere ist field2: 0607080910. Der Befehl lautet:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'

splitarbeitet mit mehrzeiligen Dateien, nicht mit einer einzeiligen Datei oder einem String. Im folgenden Beispiel verwende ich jotweil seqin nicht auf meinem System. Außerdem verwende ich BSD sedmit einem Zusatz, der die Markierung 060in einen Doppelpunkt ändert. Dies erzeugt die Zeichenfolge 0102030405:7080910. Wir fügen den 060Rücken in die zweite Datei ein.

    jot -w "%02d" 10 1                                     |
    sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/060/:/'|
    IFS=: read -r one two
    echo "$one" > file1
    echo "060${two}" > file2
Das jot -w "%02d" 10 1 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/060/:/' | IFS=: read -r one twogibt mir nichts als Ausgabe. Was ist Ihr Output in dieser Phase? Das Problem ist mit IFS=... Mein derzeit in Debian 8.1 hier readist irgendeine Linux-Variante.
Die ersten beiden Befehle gebe ich korrekt aus 0102030405:7080910. Ich versuche OSX bald in die Finger zu bekommen. Was -rmacht diese Flagge? Ich versuche es mit diesem Debian 8.1.
Ich gehe davon aus, dass Sie verwenden bash. Geben Sie einfach help readeine Erklärung ein.
Danke schön! Das wusste ich nicht help. Ich bekomme -r do not allow backslashes to escape any characters.