extraire une partie de la chaîne à l'aide de sed


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

Il donne la chaîne entière au lieu de simplement la partie oracle jusqu'au .txt Que fais-je de mal?

Je peux le faire en utilisant awk comme suit, mais je ne sais pas pourquoi sed ne donne pas le résultat souhaité.

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

Réponses:


12

[oracle.*]signifie " l' un des personnages o, r, a, c, l, e, ., ou *." Par conséquent, votre expression régulière ne correspondra qu'à quelque chose comme

lib+c.txt

et non le nom de fichier réel que vous lui transmettez. Si vous supprimez le [et ]de l'expression régulière, cela fonctionnera correctement:

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

Cependant, une manière beaucoup plus simple de le faire est

basename lib/oracle-11.2.0.3.0.txt .txt

ou, si vous voulez vraiment que le fichier provienne stdin:

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

7

Voici quelques autres façons de procéder:

  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 et bash

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

1

Que diriez-vous d'utiliser cut

echo "lib/oracle-11.2.0.3.0.txt" | cut -c5-19
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.