Bei einem String-Dateipfad wie /foo/fizzbuzz.bar
wie würde ich die Bash verwenden, um nur die fizzbuzz
Teil der besagten Zeichenkette?
Antworten
Zu viele Anzeigen?Hier sehen Sie, wie man das mit den #- und %-Operatoren in der Bash macht.
$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz
${x%.bar}
könnte auch sein ${x%.*}
um alles nach einem Punkt zu entfernen oder ${x%%.*}
um alles nach dem ersten Punkt zu entfernen.
Ejemplo:
$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz
Die Dokumentation ist zu finden in der Bash-Handbuch . Suche nach ${parameter%word}
y ${parameter%%word}
nachlaufender Teil passender Abschnitt.
Mit basename habe ich dies wie folgt erreicht:
for file in *; do
ext=${file##*.}
fname=`basename $file $ext`
# Do things with $fname
done;
Dies erfordert keine Vorkenntnisse der Dateierweiterung und funktioniert auch bei Dateinamen mit Punkten (vor der Erweiterung); es erfordert jedoch das Programm basename
aber das ist Teil der GNU coreutils, also sollte es mit jeder Distribution ausgeliefert werden.
Die Funktionen basename und dirname sind genau das Richtige für Sie:
mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")
Hat Ausgang:
basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo
- See previous answers
- Weitere Antworten anzeigen