extraer parte de la cuerda usando sed

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

Está dando toda la cadena en lugar de solo parte del oráculo 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);}'
would_like_to_be_anon
fuente

Respuestas:

12

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

lib+c.txt

y no el nombre de archivo 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 quieres que el archivo provenga de stdin:

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

Aquí hay algunas formas 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
    
terdon
fuente
1

¿Qué hay de usar cut

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