2013-04-09 16 views
11

noob hier, tut mir leid, wenn ein repost. Ich bin eine Zeichenkette aus einer Datei zu extrahieren, und mit einer Linie am Ende, so etwas wie:Extrahieren eines Teils einer Zeichenfolge zu einer Variablen in bash

abcdefg:12345:67890:abcde:12345:abcde 

Lassen Sie sich sagt, dass es in einer Variablen teststring die Länge der genannten Werte zwischen den Doppelpunkte nicht konstant ist, aber ich will um die Zahl als String in einer Variablen zwischen dem 2. und 3. Doppelpunkt zu speichern. Also würde ich in diesem Fall mit meiner neuen Variable enden, nennen wir es extrahierteNum, die 67890 ist. Ich nehme an, ich muss sed verwenden, aber habe es nie benutzt und versuche, meinen Kopf drumherum zu bekommen ... Kann mir jemand helfen? Prost

Nebenbei verwende ich find, um die gesamte Zeile aus einer Zeichenfolge zu extrahieren, indem Sie nach der ersten Zeichenfolge suchen, in diesem Fall der abcdefg Teil.

+0

mögliches Duplikat von [Wie trimme ich whitespace von bash-Variablen?] (Http://stackoverflow.com/questions/369758/how-to-) trim-whitespace-from-bash-variable) – user2284570

Antwort

9

Hier ist eine andere reine bash Art und Weise. Funktioniert gut, wenn Ihre Eingabe einigermaßen konsistent ist und Sie nicht viel Flexibilität benötigen, in welchem ​​Bereich Sie auswählen.

extractedNum="${testString#*:}"  # Remove through first : 
extractedNum="${extractedNum#*:}" # Remove through second : 
extractedNum="${extractedNum%%:*}" # Remove from next : to end of string 

Sie können auch die Datei auswählen, beim Lesen, in einer while-Schleife zum Beispiel:

while IFS=' ' read -r col line ; do 
    # col has the column you wanted, line has the whole line 
    # # # 
done < <(sed -e 's/\([^:]*:\)\{2\}\([^:]*\).*/\2 &/' "yourfile") 

Der sed-Befehl wird die 2. Spalte Kommissionierung und diesen Wert aus der ganzen Linie mit einem begrenze Raum. Wenn Sie nicht die gesamte Zeile benötigen, entfernen Sie einfach das Leerzeichen + & aus dem Ersatz und löschen Sie die Zeilenvariable aus dem gelesenen. Sie können jede Spalte auswählen, indem Sie die Nummer im Bit \ {2 \} ändern. (Setzen Sie den Befehl in doppelte Anführungszeichen, wenn Sie dort eine Variable verwenden möchten.)

+0

Alte Post, aber weil Ihre Antwort akzeptiert wurde, können Sie es mit einer so kurzen Erklärung der 'fertig <<(sed ...)' Syntax zu vervollständigen? (Der Sed Teil ist klar, ich frage mich über die zwei von rechts nach links Redirect-like <. Tx. – Cbhihe

5

Sie können für diese Art von Sachen verwenden. Hier gehen Sie:

VAR=$(echo abcdefg:12345:67890:abcde:12345:abcde |cut -d":" -f3); echo $VAR 

Für den Spaß an der Sache, das ist, wie ich (nicht) tun dies mit sed, aber ich bin sicher, es gibt einfachere Wege. Ich denke, dass für künftige Leser eine Frage meiner eigenen sein würde;)

echo abcdefg:12345:67890:abcde:12345:abcde |sed -e "s/[^:]*:[^:]*:\([^:]*\):.*/\1/" 
+0

Danke für die blitzschnelle Antwort, ich werde es versuchen! –

+0

Und wie wäre es dann, wenn ich diese Zahl später wieder in eine neue Zeichenkette schreiben würde, um zu ersetzen, was zwischen dem zweiten und dritten Doppelpunkt steht? –

+0

Ich nehme an, 'awt' ist besser geeignet, je kompletter es geht.Mit sed können Sie 'echo abcdefg: 12345: 67890: abcde: 12345: abcde | sed -e "s/\ ([^:] *: [^:] *: \) [^:] * \ (:. * \)/\ 1WHATEVER \ 2 /" ' – Miquel

2

dies sollte für Sie arbeiten:

kent$ newVar=$(echo "abcdefg:12345:67890:abcde:12345:abcde"|awk -F: '$0=$3') 

kent$ echo $newVar 
67890 

: der Schlüsselteil awk -F: '$0=$3'

NewVar=$(getTheLineSomehow...|awk -F: '$0=$3') 

Beispiel ist Wenn Ihr Text in var testString gespeichert wurde, könnten Sie:

kent$ echo $testString                                      
abcdefg:12345:67890:abcde:12345:abcde 
kent$ newVar=$(awk -F: '$0=$3' <<<"$testString") 
kent$ echo $newVar                                       
67890 
13

Reines Bash ein Array mit:

testString="abcdefg:12345:67890:abcde:12345:abcde" 
IFS=':' 
array=($testString) 
echo "value = ${array[2]}" 

Der Ausgang:

value = 67890 
+0

Sehr elegant (+1), aber (leider) nur für Array-unterstützende Linux-Shells wie bash! – Cbhihe

+2

ziemlich sicher, das ist, was das OP gefragt ... Bash –

Verwandte Themen