Ich habe die folgende Zeichenfolge:
/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand
Ich bin ein Linux-Anfänger. Wie kann ich mithilfe von „|“ als Trennzeichen trennen und eine Variable zuweisen? Ich übergebe den gesamten String als Parameter und muss die Felder einzeln aufteilen/ausschneiden.
Zum Beispiel:
function()
{
while read -r record; do
## here i need the fields to cut the fields and assign to a variable #####
done < $0
}
bash -c function "/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand"
Als ich das obige Beispiel ausprobierte, trat ein Fehler auf $0: ambiguous redirect
.
Antwort1
Sie können tr
zur Trennung ein Trennzeichen verwenden
Im folgenden Beispiel ersetzen wir |
durchnewline
variable=$(echo "/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand" | tr "|" "\n")
echo $variable
Sie können auch
echo yourtext | tr -d "|"
Sehentr-Befehl
Antwort2
So viele Probleme neben dem Hauptproblem.
ambiguous redirect
DennIhrem Code fehlen Anführungszeichen.- Die Umleitung mit
<
nimmt Daten aus einer Datei. Ihr String zeigt nicht auf eine Datei (Pfad). In Bash können Sie Daten aus einem String mit nehmen<<<
. function
ist ein reserviertes Wort. Es gibt eine Möglichkeit, eine Funktion zu benennenfunction
, aber ihre weitere Verwendung ist unpraktisch.- (Terminologie in Ihrem Kommentar) Die Funktion ist kein untergeordnetes Element.
- Man ruft eine Funktion bei ihrem Namen auf, nicht mit
bash -c
.Meine Antwort auf deine andere Fragegilt. - Dann wird das erste Argument als bezeichnet
$1
, nicht als$0
.
Dieser Code funktioniert, obwohl ich nicht sicher bin, ob es genau das ist, was Sie wollen:
#!/bin/bash
split_string ()
{
readarray -t arrayv < <(tr '|' '\n' <<< "$1")
}
split_string '/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand'
# now arrayv is an array variable (indexed from 0)
# retrieving few values
echo "${arrayv[0]}"
echo "${arrayv[5]}"
echo "${arrayv[9]}"
Anmerkungen:
- Sie haben die Zeichenfolge in doppelte Anführungszeichen gesetzt. Denken Sie daran, dass eine Zeichenfolge in doppelten Anführungszeichen bestimmten Erweiterungen unterliegt. Ihre Zeichenfolge enthält nichts, was erweitert werden könnte/könnte (z. B.
$
), daher sind doppelte Anführungszeichen in diesem speziellen Fall in Ordnung. Verwenden Sie im Allgemeinen einfache Anführungszeichen, um Erweiterungen zu unterdrücken. readarray
ist ein Synonym fürmapfile
.help mapfile
Zum Lernen aufrufen.- Weiteres Forschungsmaterial:
<<<
,<( … )
,Arrays. - Es gibt keine Möglichkeit,
export
einer Array-Variablen die Umgebung zuzuweisen. Wir könnten als Trennzeichen Folgendes
readarray
verwenden :|
readarray -t -d '|' arrayv <<< "$1"
aber dann würde das letzte „Feld“ ein abschließendes Zeilenumbruchzeichen enthalten (dies würde aufgrund der Funktionsweise angezeigt werden
<<<
). Ich wandle alle Trennzeichen mit in Zeilenumbrüche umtr
und verwende dannreadarray
die Standardeinstellung (Zeilenumbrüche als Trennzeichen).Leerzeichen gehören nicht zu Trennzeichen, sie werden Teil der gespeicherten Werte. Verwenden Sie
sed
stattdessen,tr
um Teilzeichenfolgen von Trennzeichen mit angrenzenden Leerzeichen in einzelne Zeilenumbruchzeichen umzuwandeln. Diereadarray …
Zeile sieht dann so aus:readarray -t arrayv < <(sed 's/ *| */\n/g' <<< "$1")
Wenn Sie die Funktion nur einmal verwenden möchten, brauchen Sie überhaupt keine Funktion. Diese Zeile (außerhalb einer Funktion) erledigt den Job:
readarray -t arrayv < <(tr '|' '\n' <<< '/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand')
Ich habe eine Funktion definiert (und sie dann nur einmal verwendet), weil Sie versucht haben, eine zu definieren.
Wenn Ihre Eingabezeichenfolge aus einer festen Anzahl von Feldern besteht und die Felder eine Bedeutung haben, kann es sinnvoll sein, sie verschiedenen (nicht Array-, regulären) Variablen zuzuweisen, deren Namen eine Bedeutung haben. Beispiel:
IFS='|' read -r path1 path2 path3 path4 path5 ip path6 wtf1 wtf2 wtf3 extra < <(sed 's/ *| */|/g' <<< '/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand') echo "$ip" echo "$wtf3"
Besondere Hinweise:
- Hier verwenden wir ausdrücklich
|
als Trennzeichen. Wenn wir verwendenread
, ist der nachfolgende Zeilenumbruch (der aufgrund der Funktionsweise bestimmter Umleitungen und Tools angezeigt wird) nicht nur harmlos, sondern erforderlich. - Ich habe die
extra
Variable hinzugefügt. Wenn mehr Felder als erwartet vorhanden sind, belegen die überzähligen Felderextra
. Ohneextra
sie würden sie beeinträchtigen$wtf3
. - Sie können
export
diese Variablen.
- Hier verwenden wir ausdrücklich
Wenn Sie Dateien/Streams bearbeiten möchten, die (viele) Datensätze in einer Form von
foo|bar|baz|…
(oderfoo | bar | baz | …
oder ähnlich) enthalten, machen Sie sich mit vertrautawk
.