Frage

Ich habe einen Dateinamen in einem format wie:

system-source-yyyymmdd.dat

Ich möchte in der Lage sein zu analysieren, die verschiedenen bits von Dateinamen mit "-" als Trennzeichen.

War es hilfreich?

Lösung

Sie verwenden können die cut-Befehl zu bekommen bei jeder der 3 'Felder', z.B.:

$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source

"-d" gibt die Trennzeichen "-f" gibt die Nummer des Feldes, das Sie benötigen

Andere Tipps

Ein schönes und elegantes (in meinem Kopf :-) nur mit gebaut-ins, ist, Sie in ein array

var='system-source-yyyymmdd.dat'
parts=(${var//-/ })

Anschließend können Sie die Teile in dem array...

echo ${parts[0]}  ==> system
echo ${parts[1]}  ==> source
echo ${parts[2]}  ==> yyyymmdd.dat

VORBEHALT:dies funktioniert nicht, wenn der Dateiname enthält "komische" Zeichen wie Raum, oder, Gott verbietet, Zitate, backquotes...

Je nach Ihren Bedürfnissen, awk ist flexibler als schneiden.Ein Erster teaser:

# echo "system-source-yyyymmdd.dat" \
    |awk -F- '{printf "System: %s\nSource: %s\nYear: %s\nMonth: %s\nDay: %s\n",
              $1,$2,substr($3,1,4),substr($3,5,2),substr($3,7,2)}'
System: system
Source: source
Year: yyyy
Month: mm
Day: dd

Problem ist, dass die Beschreibung awk als "flexibler" ist sicherlich, wie der Aufruf das iPhone eine verbesserte Handy ;-)

Verwenden Sie die cut Befehl.

z.B.

echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'

extrahieren wird das erste bit.

Ändern Sie den Wert des -f parameter, um die entsprechenden Teile.

Hier ist eine Anleitung, auf der Schnitt Befehl.

Eine andere Methode ist die Verwendung der shell-interne Analyse-tools, vermeidet die Kosten für die Erstellung Kind-Prozesse:

oIFS=$IFS
IFS=-
file="system-source-yyyymmdd.dat"
set $file
IFS=$oIFS
echo "Source is $2"

Die einfachste (und IMO beste Weg, dies zu tun ist einfach zu bedienen read:

$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat

Es gibt viele Variationen zu diesem Thema, von denen viele in der shell-abhängig:

bash$ IFS=-. read system source date ext <<< foo-bar-yyyymmdd.dat

echo "$name" | { IFS=-. read system source date ext
   echo In all shells, the variables are set here...; }
echo but only in some shells do they retain their value here
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top