estrarre parte della stringa usando sed


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

Dà l'intera stringa invece della sola parte dell'oracolo fino a .txt Cosa sto facendo di sbagliato?

Posso farlo usando awk come segue, ma non sono sicuro del perché sed non stia dando il risultato desiderato.

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

Risposte:


12

[oracle.*]significa "uno dei personaggi o, r, a, c, l, e, ., o *". Di conseguenza, il tuo regex corrisponderà solo a qualcosa del genere

lib+c.txt

e non il nome file effettivo che stai passando. Se rimuovi [e ]dal regex, funzionerà bene:

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

Tuttavia, è un modo molto più semplice di farlo

basename lib/oracle-11.2.0.3.0.txt .txt

oppure, se vuoi davvero che il file provenga da stdin:

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

7

Ecco alcuni altri modi per farlo:

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.