Ich habe diese Zeichenfolge in einer Variablen gespeichert:
IN="[email protected];[email protected]"
Jetzt möchte ich die Zeichenfolgen nach ;
Trennzeichen aufteilen , damit ich Folgendes habe:
ADDR1="[email protected]"
ADDR2="[email protected]"
Ich brauche die ADDR1
und ADDR2
Variablen nicht unbedingt . Wenn sie Elemente eines Arrays sind, ist das noch besser.
Nach den Vorschlägen aus den folgenden Antworten kam ich zu folgendem Ergebnis:
#!/usr/bin/env bash
IN="[email protected];[email protected]"
mails=$(echo $IN | tr ";" "\n")
for addr in $mails
do
echo "> [$addr]"
done
Ausgabe:
> [bla@some.com]
> [john@home.com]
Es gab eine Lösung, bei der Internal_field_separator (IFS) auf gesetzt wurde ;
. Ich bin nicht sicher, was mit dieser Antwort passiert ist. Wie können Sie IFS
die Standardeinstellungen wiederherstellen?
RE: IFS
Lösung, ich habe es versucht und es funktioniert, ich behalte das alte IFS
und stelle es dann wieder her:
IN="[email protected];[email protected]"
OIFS=$IFS
IFS=';'
mails2=$IN
for x in $mails2
do
echo "> [$x]"
done
IFS=$OIFS
Übrigens, als ich es versuchte
mails2=($IN)
Ich habe nur die erste Zeichenfolge beim Drucken in einer Schleife erhalten, ohne dass Klammern darum herum $IN
funktionieren.
local IFS=...
wo möglich; (b) -1 fürunset IFS
, dies setzt IFS nicht genau auf seinen Standardwert zurück, obwohl ich glaube, dass sich ein nicht gesetztes IFS genauso verhält wie der Standardwert von IFS ($ '\ t \ n'), aber es scheint eine schlechte Praxis zu sein Nehmen Sie blind an, dass Ihr Code niemals aufgerufen wird, wenn IFS auf einen benutzerdefinierten Wert eingestellt ist. (c) Eine andere Idee besteht darin, eine Unterschale aufzurufen:(IFS=$custom; ...)
Wenn die Unterschale beendet wird, kehrt IFS zu dem zurück, was sie ursprünglich war.ruby -e "puts ENV.fetch('PATH').split(':')"
. Wenn Sie reine Bash bleiben möchten, hilft es nicht, aber die Verwendung einer Skriptsprache mit integriertem Split ist einfacher.for x in $(IFS=';';echo $IN); do echo "> [$x]"; done
\n
für nur ein Leerzeichen ändern . Die letzte Zeile ist alsomails=($(echo $IN | tr ";" " "))
. Jetzt kann ich die Elemente überprüfen,mails
indem ich die Array-Notation verwendemails[index]
oder einfach in einer Schleife iteriereAntworten:
Sie können die IFS-Variable ( Internal Field Separator ) festlegen und sie dann in ein Array analysieren lassen. Wenn dies in einem Befehl geschieht, erfolgt die Zuweisung an
IFS
nur an die Umgebung dieses einzelnen Befehls (anread
). Anschließend wird die Eingabe gemäß demIFS
Variablenwert in ein Array analysiert , über das wir dann iterieren können.Es wird eine durch getrennte Zeile von Elementen analysiert
;
und in ein Array verschoben. Zeug für die Verarbeitung der gesamten$IN
, jedes Mal eine Eingabezeile getrennt durch;
:quelle
IFS
in derselben Zeile wie dieread
ohne Semikolon oder anderes Trennzeichen im Gegensatz zu einem separaten Befehl bezieht sich auf diesen Befehl - daher wird sie immer "wiederhergestellt". Sie müssen nichts manuell tun.$IN
zitiert werden muss. Der Fehler wurde inbash
4.3 behoben .Entnommen aus dem Split-Array des Bash-Shell-Skripts :
Erläuterung:
Diese Konstruktion ersetzt alle Vorkommen von
';'
(der Anfang//
bedeutet globales Ersetzen) in der ZeichenfolgeIN
durch' '
(ein einzelnes Leerzeichen) und interpretiert dann die durch Leerzeichen getrennte Zeichenfolge als Array (dies tun die umgebenden Klammern).Die Syntax, die in den geschweiften Klammern verwendet wird, um jedes
';'
Zeichen durch ein' '
Zeichen zu ersetzen, wird als Parametererweiterung bezeichnet .Es gibt einige häufige Fallstricke:
IFS=':'; arrIN=($IN); unset IFS;
IFS=$'\n'; arrIN=($IN); unset IFS;
quelle
IN="[email protected];[email protected];*;broken apart"
. Kurz gesagt: Dieser Ansatz wird unterbrochen, wenn Ihre Token eingebettete Leerzeichen und / oder Zeichen enthalten. In*
diesem Fall stimmt ein Token mit den Dateinamen im aktuellen Ordner überein.;*;
,*
wird die Zeichenfolge auf eine Liste von Dateinamen im aktuellen Verzeichnis erweitert. -1Wenn es Ihnen nichts ausmacht, sie sofort zu verarbeiten, mache ich das gerne:
Sie könnten diese Art von Schleife verwenden, um ein Array zu initialisieren, aber es gibt wahrscheinlich einen einfacheren Weg, dies zu tun. Hoffe das hilft aber.
quelle
IN="[email protected];[email protected];*;broken apart"
. Kurz gesagt: Dieser Ansatz wird unterbrochen, wenn Ihre Token eingebettete Leerzeichen und / oder Zeichen enthalten. In*
diesem Fall stimmt ein Token mit den Dateinamen im aktuellen Ordner überein.Kompatible Antwort
Es gibt viele verschiedene Möglichkeiten, dies zu tun Bash.
Allerdings ist es wichtig, zuerst zu beachten Sie, dass
bash
viele hat spezielle Eigenschaften (so genannte bashisms ) das wird nicht funktionieren in jedem anderenSchale.Insbesondere Arrays , assoziative Arrays und Mustersubstitutionen , die in den Lösungen in diesem Beitrag sowie in anderen im Thread verwendet werden, sind Bashismen und funktionieren möglicherweise nicht unter anderen Shells , die von vielen Personen verwendet werden.
Zum Beispiel: Auf meinem Debian GNU / Linux gibt es eine Standard- Shell namensStrich;; Ich kenne viele Leute, die gerne eine andere Shell namens verwendenksh;; und es gibt auch ein spezielles Werkzeug namensBusybox mit seinem eigenen Shell-Interpreter (Asche).
Angeforderte Zeichenfolge
Die in der obigen Frage zu teilende Zeichenfolge lautet:
Ich werde eine modifizierte Version dieser Zeichenfolge verwenden, um sicherzustellen, dass meine Lösung gegenüber Zeichenfolgen mit Leerzeichen robust ist, wodurch andere Lösungen beschädigt werden können:
Teilen Sie die Zeichenfolge basierend auf dem Trennzeichen in Bash (Version> = 4.2)
In rein
bash
können wir ein Array mit Elementen erstellen, die durch einen temporären Wert für IFS (das Eingabefeldtrennzeichen ) getrennt sind. Das IFS gibt unter anderem an,bash
welche Zeichen bei der Definition eines Arrays als Trennzeichen zwischen Elementen behandelt werden sollen:In neueren Versionen von
bash
, einen Befehl mit einer IFS - Definition voran ändert die IFS für diesen Befehl nur und setzt sie auf den vorherigen Wert unmittelbar danach. Dies bedeutet, dass wir das Obige in nur einer Zeile tun können:Wir können sehen, dass die Zeichenfolge
IN
in einem Array mit dem Namen gespeichert wurdefields
, das auf die Semikolons aufgeteilt ist:(Wir können den Inhalt dieser Variablen auch mit anzeigen
declare -p
:)Beachten Sie, dass dies
read
der schnellste Weg ist, um die Aufteilung durchzuführen, da keine Gabeln oder externen Ressourcen aufgerufen werden.Sobald das Array definiert ist, können Sie jedes Feld (oder vielmehr jedes Element in dem Array, das Sie jetzt definiert haben) mit einer einfachen Schleife verarbeiten:
Oder Sie können jedes Feld nach der Verarbeitung mit einem Shifting- Ansatz aus dem Array entfernen , was mir gefällt:
Und wenn Sie nur einen einfachen Ausdruck des Arrays wünschen, müssen Sie es nicht einmal durchlaufen:
Update: aktuell Bash > = 4,4
In neueren Versionen von
bash
können Sie auch mit dem folgenden Befehl spielenmapfile
:Diese Syntax bewahrt Sonderzeichen, Zeilenumbrüche und leere Felder!
Wenn Sie keine leeren Felder einfügen möchten, können Sie Folgendes tun:
Mit
mapfile
können Sie auch das Deklarieren eines Arrays überspringen und implizit die begrenzten Elemente "durchlaufen", indem Sie jeweils eine Funktion aufrufen:(Hinweis: Das
\0
am Ende der Formatzeichenfolge ist nutzlos, wenn Sie sich nicht um leere Felder am Ende der Zeichenfolge kümmern oder diese nicht vorhanden sind.)Oder Sie könnten verwenden
<<<
und in den Funktionskörper eine Verarbeitung aufnehmen, um die hinzugefügte neue Zeile zu löschen:Teilen Sie die Zeichenfolge basierend auf dem Trennzeichen in Schale
Wenn Sie nicht verwenden können
bash
, oder wenn Sie etwas schreiben wollen , die in vielen verschiedenen Muscheln verwendet werden können, können Sie oft nicht verwenden bashisms - und dazu gehören auch die Arrays wir oben haben in den Lösungen.Wir müssen jedoch keine Arrays verwenden, um "Elemente" eines Strings zu durchlaufen. In vielen Shells wird eine Syntax zum Löschen von Teilzeichenfolgen einer Zeichenfolge aus dem ersten oder letzten Auftreten eines Musters verwendet. Beachten Sie, dass
*
ein Platzhalter ist, der für null oder mehr Zeichen steht:(Das Fehlen dieses Ansatzes in einer bisher veröffentlichten Lösung ist der Hauptgrund, warum ich diese Antwort schreibe;)
Wie von Score_Under erklärt :
Mit der obigen Syntax können wir einen Ansatz erstellen, bei dem wir Teilstring- "Elemente" aus der Zeichenfolge extrahieren, indem wir die Teilzeichenfolgen bis zum oder nach dem Trennzeichen löschen.
Der folgende Codeblock funktioniert gut in Bash (einschließlich Mac OS
bash
),Strich, ksh, und Busybox's Asche::Habe Spaß!
quelle
#
,##
,%
und%%
Substitutionen haben , was IMO ist eine einfachere Erklärung (für wie viel sie löschen) zu erinnern:#
und%
die kürzest mögliche passende String löschen, und##
und%%
möglichst lange löschen.IFS=\; read -a fields <<<"$var"
schlägt bei Zeilenumbrüchen fehl und fügt eine nachfolgende Zeilenumbruch hinzu. Die andere Lösung entfernt ein nachfolgendes leeres Feld.for sep in "#" "ł" "@" ; do ... var="${var#*$sep}" ...
Ich habe einige Antworten gesehen, die auf den
cut
Befehl verweisen , aber alle wurden gelöscht. Es ist ein wenig seltsam, dass niemand darauf eingegangen ist, weil ich denke, dass dies einer der nützlicheren Befehle für diese Art von Dingen ist, insbesondere für das Parsen von begrenzten Protokolldateien.Wenn Sie dieses spezielle Beispiel in ein Bash-Skript-Array aufteilen,
tr
ist es wahrscheinlich effizienter,cut
kann aber verwendet werden und ist effektiver, wenn Sie bestimmte Felder aus der Mitte ziehen möchten.Beispiel:
Sie können dies natürlich in eine Schleife einfügen und den Parameter -f wiederholen, um jedes Feld unabhängig zu ziehen.
Dies ist nützlicher, wenn Sie eine begrenzte Protokolldatei mit folgenden Zeilen haben:
cut
Es ist sehr praktisch,cat
diese Datei zu verwenden und ein bestimmtes Feld für die weitere Verarbeitung auszuwählen.quelle
cut
, es ist das richtige Werkzeug für den Job! Viel geklärt als jeder dieser Shell-Hacks.Das hat bei mir funktioniert:
quelle
Wie wäre es mit diesem Ansatz:
Quelle
quelle
IFS";" && Array=($IN)
$'...'
:IN=$'[email protected];[email protected];bet <d@\ns* kl.com>'
. Dannecho "${Array[2]}"
wird eine Zeichenfolge mit Zeilenumbruch gedruckt.set -- "$IN"
ist auch in diesem Fall notwendig. Ja, um eine Glob-Expansion zu verhindern, sollte die Lösung Folgendes enthaltenset -f
.Ich denke, AWK ist der beste und effizienteste Befehl, um Ihr Problem zu lösen. AWK ist standardmäßig in fast jeder Linux-Distribution enthalten.
wird geben
Natürlich können Sie jede E-Mail-Adresse speichern, indem Sie das awk-Druckfeld neu definieren.
quelle
inode=
in;
zum Beispiel durchsed -i 's/inode\=/\;/g' your_file_to_process
, dann definieren ,-F';'
wenn anwendenawk
, Hoffnung , die Ihnen helfen kann.quelle
IN="this is first line; this is second line" arrIN=( $( echo "$IN" | sed -e 's/;/\n/g' ) )
wird in diesem Fall ein Array von 8 Elementen erzeugt (ein Element für jeden getrenntenarrIN=( $( echo "$IN" | sed -e 's/;/\n/g' ) )
zu erreichen, und um Ratschläge zu geben, IFSIFS=$'\n'
für diejenigen zu ändern, die in Zukunft hier landen und eine Zeichenfolge mit Leerzeichen teilen müssen. (und um es danach wieder herzustellen). :)Dies funktioniert auch:
Seien Sie vorsichtig, diese Lösung ist nicht immer korrekt. Wenn Sie nur "[email protected]" übergeben, wird es sowohl ADD1 als auch ADD2 zugewiesen.
quelle
Eine andere Sicht auf Darrons Antwort , so mache ich es:
quelle
IFS=";"
Zuordnung existiert nur in der$(...; echo $IN)
Unterschale; Aus diesem Grund denken einige Leser (einschließlich mir) zunächst, dass es nicht funktionieren wird. Ich nahm an, dass ADDR1 alle $ IN verschluckt hatte. Aber nickjb ist richtig; es funktioniert. Der Grund dafür ist, dass derecho $IN
Befehl seine Argumente mit dem aktuellen Wert von $ IFS analysiert, sie dann jedoch unabhängig von der Einstellung von $ IFS mit einem Leerzeichen in stdout umwandelt. Der Nettoeffekt ist also so, als hätte man aufgerufenread ADDR1 ADDR2 <<< "[email protected] [email protected]"
(beachten Sie, dass die Eingabe nicht durch Leerzeichen getrennt, sondern durch Leerzeichen getrennt ist).*
in derecho $IN
mit einer nicht zitierten Variablenerweiterung.In Bash, einer kugelsicheren Methode, die auch dann funktioniert, wenn Ihre Variable Zeilenumbrüche enthält:
Aussehen:
Der Trick, damit dies funktioniert, besteht darin, die
-d
Optionread
(Trennzeichen) mit einem leeren Trennzeichen zu verwenden, sodassread
gezwungen ist, alles zu lesen, was eingegeben wird. Und wir fütternread
mit genau dem Inhalt der Variablenin
, ohne nachfolgende Zeilenumbrüche dankprintf
. Beachten Sie, dass wir auch das Trennzeichen einfügen,printf
um sicherzustellen, dass die übergebene Zeichenfolgeread
ein nachfolgendes Trennzeichen enthält. Ohne sieread
würden potenzielle nachfolgende leere Felder gekürzt:Das nachfolgende leere Feld bleibt erhalten.
Update für Bash≥4.4
Seit Bash 4.4 unterstützt das eingebaute
mapfile
(auch bekannt alsreadarray
) die-d
Option, ein Trennzeichen anzugeben. Daher ist ein anderer kanonischer Weg:quelle
\n
Leerzeichen und*
gleichzeitig funktioniert . Auch keine Schleifen; Auf die Array-Variable kann nach der Ausführung in der Shell zugegriffen werden (im Gegensatz zur Antwort mit der höchsten Bewertung). Beachten Sie,in=$'...'
dass dies nicht mit doppelten Anführungszeichen funktioniert. Ich denke, es braucht mehr Upvotes.Wie wäre es mit diesem einen Liner, wenn Sie keine Arrays verwenden:
quelle
read -r ...
um sicherzustellen, dass beispielsweise die beiden Zeichen "\ t" in der Eingabe dieselben zwei Zeichen in Ihren Variablen sind (anstelle eines einzelnen Tabulatorzeichens).echo "ADDR1 $ADDR1"\n echo "ADDR2 $ADDR2"
zu Ihrem Snippet wird ausgegebenADDR1 [email protected] [email protected]\nADDR2
(\ n ist Newline)IFS
Zeichenfolgen handelt, die inbash
4.3 behoben wurden . Das Zitieren$IN
sollte das Problem beheben. (Theoretisch$IN
unterliegt es nach dem Erweitern keiner Wortaufteilung oder -globierung, was bedeutet, dass die Anführungszeichen unnötig sein sollten. Selbst in 4.3 ist jedoch noch mindestens ein Fehler vorhanden - gemeldet und geplant, um behoben zu werden -, sodass das Zitieren weiterhin gut ist Idee.)Ohne das IFS einzustellen
Wenn Sie nur einen Doppelpunkt haben, können Sie dies tun:
Sie erhalten:
quelle
Hier ist ein sauberer 3-Liner:
Dabei werden
IFS
Wörter basierend auf dem Trennzeichen abgegrenzt und()
zum Erstellen eines Arrays verwendet . Dann[@]
wird jedes Element als separates Wort zurückgegeben.Wenn Sie danach Code haben, müssen Sie auch wiederherstellen
$IFS
, zunset IFS
.quelle
$in
nicht zitierten Platzhaltern können Platzhalter erweitert werden.Die folgende Bash / zsh-Funktion teilt ihr erstes Argument in das durch das zweite Argument angegebene Trennzeichen auf:
Zum Beispiel der Befehl
ergibt
Diese Ausgabe kann beispielsweise an andere Befehle weitergeleitet werden. Beispiel:
Gegenüber den anderen angegebenen Lösungen bietet diese folgende Vorteile:
IFS
wird nicht überschrieben: Aufgrund des dynamischen Bereichs selbst lokaler Variablen führt das ÜberschreibenIFS
einer Schleife dazu, dass der neue Wert in Funktionsaufrufe aus der Schleife gelangt.Arrays werden nicht verwendet: Das Einlesen eines Strings in ein Array mit
read
erfordert das Flag-a
in Bash und-A
in zsh.Falls gewünscht, kann die Funktion wie folgt in ein Skript eingefügt werden:
quelle
help read
:-d delim continue until the first character of DELIM is read, rather than newline
Sie können awk auf viele Situationen anwenden
auch du kannst das benutzen
quelle
Es gibt einen einfachen und intelligenten Weg wie diesen:
Aber Sie müssen gnu xargs verwenden, BSD xargs kann -d delim nicht unterstützen. Wenn Sie Apple Mac wie ich verwenden. Sie können gnu xargs installieren:
dann
quelle
Dies ist der einfachste Weg, dies zu tun.
quelle
Hier gibt es einige coole Antworten (insbesondere Errator), aber für etwas Analoges, das in andere Sprachen aufgeteilt werden kann - was ich mit der ursprünglichen Frage gemeint habe - habe ich mich dazu entschlossen:
Jetzt
${a[0]}
sind${a[1]}
usw. so, wie Sie es erwarten würden. Verwenden Sie${#a[*]}
für die Anzahl der Begriffe. Oder um es zu wiederholen:WICHTIGE NOTIZ:
Dies funktioniert in Fällen, in denen es keine Leerzeichen gibt, über die Sie sich Sorgen machen müssen, wodurch mein Problem gelöst wurde, Ihr Problem jedoch möglicherweise nicht gelöst wird. Gehen Sie
$IFS
in diesem Fall mit den Lösungen.quelle
IN
mehr als zwei E-Mail-Adressen enthalten sind. Bitte beziehen Sie sich auf die gleiche Idee (aber behoben) bei Palindroms Antwort${IN//;/ }
(doppelter Schrägstrich), damit es auch mit mehr als zwei Werten funktioniert. Beachten Sie, dass alle Platzhalter (*?[
) erweitert werden. Und ein nachfolgendes leeres Feld wird verworfen.Ausgabe
System: Ubuntu 12.04.1
quelle
read
hier gesetzt und kann daher den Rest des Codes, falls vorhanden, stören.Wenn kein Platz, warum nicht das?
quelle
Verwenden Sie die
set
integrierte Funktion, um das$@
Array zu laden :Dann lass die Party beginnen:
quelle
set -- $IN
, um einige Probleme mit "$ IN" zu vermeiden, beginnend mit Bindestrich. Die nicht zitierte Erweiterung von$IN
wird jedoch Platzhalter erweitern (*?[
).Zwei bourne-ish Alternativen, für die keine Bash-Arrays erforderlich sind:
Fall 1 : Halten Sie es schön und einfach: Verwenden Sie eine NewLine als Datensatztrennzeichen ... z.
Hinweis: In diesem ersten Fall wird kein Unterprozess gegabelt, um die Listenmanipulation zu unterstützen.
Idee: Vielleicht lohnt es sich, NL ausgiebig intern zu verwenden und nur dann in eine andere RS zu konvertieren, wenn das Endergebnis extern generiert wird .
Fall 2 : Verwenden eines ";" als Datensatztrennzeichen ... zB.
In beiden Fällen kann eine Unterliste innerhalb der Schleife erstellt werden, die nach Abschluss der Schleife bestehen bleibt. Dies ist nützlich, wenn Sie Listen im Speicher bearbeiten und stattdessen Listen in Dateien speichern. {ps bleib ruhig und mach weiter B-)}
quelle
Abgesehen von den fantastischen Antworten, die bereits gegeben wurden, sollten Sie nur die Daten ausdrucken, die Sie möglicherweise verwenden möchten
awk
:Dadurch wird das Feldtrennzeichen auf gesetzt
;
, sodass es die Felder mit einerfor
Schleife durchlaufen und entsprechend drucken kann.Prüfung
Mit einer anderen Eingabe:
quelle
In der Android-Shell funktionieren die meisten der vorgeschlagenen Methoden einfach nicht:
Was funktioniert ist:
wo
//
bedeutet globaler Ersatz.quelle
Ausgabe:
Erläuterung: Durch die einfache Zuweisung mit in Klammern () wird eine durch Semikolons getrennte Liste in ein Array konvertiert, sofern Sie dabei über das richtige IFS verfügen. Die Standard-FOR-Schleife behandelt einzelne Elemente in diesem Array wie gewohnt. Beachten Sie, dass die für die IN-Variable angegebene Liste in "harten" Anführungszeichen stehen muss, dh mit einzelnen Ticks.
IFS muss gespeichert und wiederhergestellt werden, da Bash eine Zuweisung nicht wie einen Befehl behandelt. Eine alternative Problemumgehung besteht darin, die Zuweisung in eine Funktion einzubinden und diese Funktion mit einem modifizierten IFS aufzurufen. In diesem Fall ist ein separates Speichern / Wiederherstellen von IFS nicht erforderlich. Vielen Dank für "Bize", dass Sie darauf hingewiesen haben.
quelle
!"#$%&/()[]{}*? are no problem
[]*?
na ja ... nicht ganz: sind glob zeichen. Was ist also mit dem Erstellen dieses Verzeichnisses und der Datei: `mkdir '!" # $% &'; Touch '! "# $% & / () [] {} Hast du hahahaha - bist kein Problem' und dem Ausführen deines Befehls? einfach mag schön sein, aber wenn es kaputt ist, ist es kaputt.mkdir '!"#$%&'; touch '!"#$%&/()[]{} got you hahahaha - are no problem'
. Sie werden nur ein Verzeichnis und eine Datei mit seltsam aussehenden Namen erstellen, muss ich zugeben. Führen Sie dann Ihre Befehle mit genau dem aus, wasIN
Sie angegeben haben :IN='[email protected];[email protected];Charlie Brown <[email protected];!"#$%&/()[]{}*? are no problem;simple is beautiful :-)'
. Sie werden sehen, dass Sie nicht die erwartete Ausgabe erhalten. Weil Sie eine Methode verwenden, die Pfadnamenerweiterungen unterliegt, um Ihre Zeichenfolge zu teilen.*
,?
,[...]
und sogar, wennextglob
gesetzt,!(...)
,@(...)
,?(...)
,+(...)
sind Probleme mit dieser Methode!Okay Leute!
Hier ist meine Antwort!
Warum ist dieser Ansatz für mich "der Beste"?
Aus zwei Gründen:
[] 's
quelle
/etc/os-release
und/etc/lsb-release
sollen beschafft und nicht analysiert werden. Ihre Methode ist also wirklich falsch. Außerdem beantworten Sie die Frage nach dem Verschieben einer Zeichenfolge auf ein TrennzeichenEin Einzeiler zum Teilen einer durch ';' getrennten Zeichenfolge. in ein Array ist:
Dadurch wird IFS nur in einer Subshell festgelegt, sodass Sie sich nicht um das Speichern und Wiederherstellen des Werts kümmern müssen.
quelle
0: [email protected];[email protected]\n 1:
(\ n ist eine neue Zeile)$IN
wird zitiert, damit es nicht der IFS-Aufteilung unterliegt. 3. Die Prozessersetzung wird durch Leerzeichen aufgeteilt, dies kann jedoch die Originaldaten beschädigen.Vielleicht nicht die eleganteste Lösung, aber funktioniert mit
*
und Räume:Ausgänge
Anderes Beispiel (Begrenzer am Anfang und am Ende):
Grundsätzlich entfernt sie jedes andere Zeichen als zu
;
machendelims
zB.;;;
. Dann wird einefor
Schleife von1
bis ausgeführt,number-of-delimiters
wie von gezählt${#delims}
. Der letzte Schritt besteht darin, das$i
dritte Teil sicher zu verwendencut
.quelle