2017-06-10 5 views
0

Ich versuche ein Bash-Skript zu automatisieren extrahieren Tear-Archive und meine sed Regex funktioniert nicht wie erwartet. Wenn ich das tue:sed pattern matching funktioniert nicht

archive=$1 
directory=$(sed "s/.tar.bz2$//" <<< $archive) 
echo "extracting $archive to $directory" 

ich:

$ sh extract binutils-2.27.tar.bz2 
extracting binutils-2.27.tar.bz2 to binutils-2.27 

die als erwartet ist.

Aber wenn ich tue:

archive=$1 
directory=$(sed "s/.tar.[a-z0-9]{2,3}$//" <<< $archive) 
echo "extracting $archive to $directory" 

das ist, was ich tun will (so wie jede Art von Archiv zu handhaben), würde ich erwarten, dass die gleiche Leistung zu erhalten, aber ich bin immer:

$ sh extract binutils-2.27.tar.bz2 
extracting binutils-2.27.tar.bz2 to binutils-2.27.tar.bz2 

Wie Sie sehen können, gilt die Regex nicht.

Ich habe meine Regex auf regex101.com getestet und es scheint richtig zu sein, aber es scheint nicht richtig im Bash-Skript zu funktionieren. Kann mir bitte jemand in die richtige Richtung weisen, was schief läuft?

Ich bin auf Mint 17.3.

Antwort

1

Sie benötigen die -E Flagge auf sed:

$ archive=binutils-2.27.tar.bz2 
$ directory=$(sed "s/.tar.[a-z0-9]{2,3}$//" <<< $archive) 
$ echo $directory 
binutils-2.27.tar.bz2 
$ directory=$(sed -E "s/.tar.[a-z0-9]{2,3}$//" <<< $archive) 
$ echo $directory 
binutils-2.27 
+0

Verwenden Sie einzelne Anführungszeichen für Skripte, es sei denn, Sie haben eine Spezifikation c BENÖTIGEN Sie dies nicht (z. um die Shell eine Variable erweitern zu lassen), entwische RE - Metazeichen, wenn sie wörtlich behandelt werden sollen (zB '.'), und zitiere deine Variablen (' echo "$ directory" '), es sei denn du hast spezielle NEEDs (zB globbing)) –

2

Die sed basierte Lösung wäre:

directory=${archive%.tar.*} 
:

directory=$(sed -E 's/\.tar\.[a-z0-9]{2,3}$//' <<< $archive) 

jedoch mit einigen Annahmen, Sie bash Funktionen nur verwenden können,