einen Teil der Schnur mit sed extrahieren

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

Es gibt die ganze Zeichenfolge statt nur einen Orakelteil bis .txt Was mache ich falsch?

Ich kann es mit awk wie folgt machen, bin mir aber nicht sicher, warum sed nicht das gewünschte Ergebnis liefert.

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

Antworten:

12

[oracle.*]bedeutet "eines der Zeichen o, r, a, c, l, e, ., oder *". Folglich stimmt Ihre Regex nur mit so etwas überein

lib+c.txt

und nicht den tatsächlichen Dateinamen, den Sie übergeben. Wenn Sie das [und ]aus dem regulären Ausdruck entfernen , funktioniert es einwandfrei:

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

Ein viel einfacherer Weg ist dies jedoch

basename lib/oracle-11.2.0.3.0.txt .txt

oder, wenn Sie wirklich möchten, dass die Datei stammt von stdin:

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

Hier sind einige weitere Möglichkeiten, dies zu tun:

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

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

Wie wäre es mit cut

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