extraer parte de una string usando sed

ls lib/oracle-11.2.0.3.0.txt | sed 's/lib.\([oracle.*]\)\.txt/\1/' 

Está dando la secuencia completa en lugar de solo la parte del oracle hasta .txt ¿Qué estoy haciendo mal?

Puedo hacerlo usando awk de la siguiente manera, pero no estoy seguro de por qué sed no está dando el resultado deseado.

 echo "lib/oracle-11.2.0.3.0.txt" | awk -F/ '{print substr($2,1,index($0,".txt")-1);}' 

[oracle.*] significa "uno de los caracteres o , r , a , c , l , e , . , o * ". En consecuencia, tu expresión regular solo coincidirá con algo como

 lib+c.txt 

y no el nombre de file real que está pasando. Si elimina el [ y ] de la expresión regular, entonces funcionará bien:

 ls lib/oracle-11.2.0.3.0.txt | sed 's/lib.\(oracle.*\)\.txt/\1/' 

Sin embargo, una forma mucho más simple de hacerlo es

 basename lib/oracle-11.2.0.3.0.txt .txt 

o, si realmente desea que el file proceda de stdin :

 ls lib/oracle-11.2.0.3.0.txt | xargs -I{} basename {} .txt 

Aquí hay algunas forms más de hacer esto:

  1. Perl

     echo "lib/oracle-11.2.0.3.0.txt" | perl -pe 's/.+(oracle.+)\.txt/$1/' 
  2. sed

     echo "lib/oracle-11.2.0.3.0.txt" | sed 's/.*\(oracle.*\)\.txt/\1/' 
  3. cut

     echo "lib/oracle-11.2.0.3.0.txt" | cut -d'/' -f 2 | cut -d '.' -f 1-5 
  4. basename y bash

     echo "lib/oracle-11.2.0.3.0.txt" | while read n; do echo $(basename ${n/.txt//}); done 

¿Qué tal usar el cut

 echo "lib/oracle-11.2.0.3.0.txt" | cut -c5-19