Wie können wir Teilzeichenfolgen in Linux durch Trennzeichen trennen?

Wie können wir Teilzeichenfolgen in Linux durch Trennzeichen trennen?

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 trzur 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.

  1. ambiguous redirectDennIhrem Code fehlen Anführungszeichen.
  2. 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 <<<.
  3. functionist ein reserviertes Wort. Es gibt eine Möglichkeit, eine Funktion zu benennen function, aber ihre weitere Verwendung ist unpraktisch.
  4. (Terminologie in Ihrem Kommentar) Die Funktion ist kein untergeordnetes Element.
  5. Man ruft eine Funktion bei ihrem Namen auf, nicht mit bash -c.Meine Antwort auf deine andere Fragegilt.
  6. 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.
  • readarrayist ein Synonym für mapfile. help mapfileZum Lernen aufrufen.
  • Weiteres Forschungsmaterial:<<<,<( … ),Arrays.
  • Es gibt keine Möglichkeit, exporteiner Array-Variablen die Umgebung zuzuweisen.
  • Wir könnten als Trennzeichen Folgendes readarrayverwenden :|

     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 um trund verwende dann readarraydie Standardeinstellung (Zeilenumbrüche als Trennzeichen).

  • Leerzeichen gehören nicht zu Trennzeichen, sie werden Teil der gespeicherten Werte. Verwenden Sie sedstattdessen, trum Teilzeichenfolgen von Trennzeichen mit angrenzenden Leerzeichen in einzelne Zeilenumbruchzeichen umzuwandeln. Die readarray …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 verwenden read, ist der nachfolgende Zeilenumbruch (der aufgrund der Funktionsweise bestimmter Umleitungen und Tools angezeigt wird) nicht nur harmlos, sondern erforderlich.
    • Ich habe die extraVariable hinzugefügt. Wenn mehr Felder als erwartet vorhanden sind, belegen die überzähligen Felder extra. Ohne extrasie würden sie beeinträchtigen $wtf3.
    • Sie können exportdiese Variablen.
  • Wenn Sie Dateien/Streams bearbeiten möchten, die (viele) Datensätze in einer Form von foo|bar|baz|…(oder foo | bar | baz | …oder ähnlich) enthalten, machen Sie sich mit vertraut awk.

verwandte Informationen