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);}'

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

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
    

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.