extrai parte da string usando sed

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

Está dando a string inteira em vez de apenas oracle part até .txt O que estou fazendo de errado?

Eu posso fazer isso usando o awk da seguinte forma, mas não tenho certeza porque o sed não está dando o resultado desejado.

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

3 respostas

12

[oracle.*] significa "um dos caracteres o , r , a , c , l , e , . ou * ". Conseqüentemente, sua regex corresponderá apenas a algo como

lib+c.txt

e não o nome do arquivo real que você está passando. Se você remover o [ e ] do regex, ele funcionará bem:

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

No entanto, uma maneira muito mais simples de fazer isso é

basename lib/oracle-11.2.0.3.0.txt .txt

ou, se você realmente quiser que o arquivo venha de stdin :

ls lib/oracle-11.2.0.3.0.txt | xargs -I{} basename {} .txt
    
por 26.06.2013 / 21:35
5

Aqui estão mais algumas maneiras de fazer isso:

  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//'
    
  3. cut

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

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

Que tal usar cut

echo "lib/oracle-11.2.0.3.0.txt" | cut -c5-19
    
por 26.06.2013 / 22:54