2016-06-21 8 views
-2

Wie extrahiere ich den Text aus dem folgenden Text und speichern Sie es auf die Variablen:Extrahieren von Text mit einem beliebigen Befehl in Linux-Shell

05:21-09:32, 14:21-19:30 

Hier, ich will 05 speichern, in einer Variablen, 21 in einem anderen, 09 in einem anderen und so weiter. Alle Werte müssen in einem Array oder in verschiedenen Variablen gespeichert werden.

ich versucht habe:

k="05:21-09:32, 14:21-19:30" 

part1=($k | awk -F"-" '{print $1}' | awk -F":" '{print $1}')                              
part2=($k | awk -F"-" '{print $2}' | awk -F":" '{print $1}') 
part3=($k | awk -F"," '{print $2}' | awk -F":" '{print $1}') 
part4=($k | awk -F"-" '{print $3}' | awk -F":" '{print $1}') 

Ich brauche eine klare Lösung oder kurze Lösung.

+4

Bitte zeigen Sie Ihre Versuche. Ein wenig zu googeln hätte dir viele gute Antworten gezeigt. – fedorqui

+0

D = "2013/01/17" DAY = $ (Datum -d "$ D" '+% d') MONTH = $ (Datum -d "$ D "+% ​​m") YEAR = $ (Datum -d "$ D" '+% Y') echo "Tag: $ DAY" echo "Monat: $ MONTH" echo "Jahr: $ YEAR" –

+0

@RaghulM das ist nicht einmal in der Nähe eines Duplikats für dieses Problem, außer einer tangentialen Verweis auf 'grep' als eine Möglichkeit. In der Referenz, die Sie erwähnen, geht es darum, wie man bekannten Text in Dateien abgleicht, bei dem Daten in separate Felder aufgeteilt werden. Nirgends nahe bei der gleichen Sache. Ich hoffe, dass Sie auf dieser Grundlage nicht geschlossen haben. –

Antwort

1

hat Ihr Code eine Reihe von Problemen.

  • Sie können nicht über die Pipeline der Wert k auf die Standardausgabe mit nur $k - wollen Sie so etwas wie printf '%s\n' "$k" oder vielleicht weniger tragbar echo "$k"
  • Beachten Sie auch im Ausdruck der zitierte oben; ohne sie wird die Shell-Wildcard-Erweiterung und Leerzeichen tokenization auf dem Wert
  • Laichen zwei Awk Prozesse für eine einfache String-Ersetzung durchführen wollen für jeden Wert, den Sie übermäßige
  • eine separate Pipeline Laichen extrahieren ineffizient ist; Wenn möglich, extrahiere alles auf einmal.

So etwas wie IFS=':-, '; set -- $k werden die Teile $1, $2, $3 und $4 in einem Rutsch zuweisen.

2

Sie read mit der -a rray Option verwenden können:

IFS=':-, ' read -ra my_arr <<< "05:21-09:32, 14:21-19:30" 

Der obige Code wird die Eingabezeichenfolge auf : aufgeteilt, -, , und Leerzeichen:

$ echo "${my_arr[0]}" "${my_arr[1]}" "${my_arr[2]}" "${my_arr[3]}" 
05 21 09 32 
Verwandte Themen