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

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

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
    

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.