ekstrak bagian dari string menggunakan sed

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

Itu memberikan seluruh string bukan hanya bagian oracle sampai .txt Apa yang saya lakukan salah?

Saya bisa melakukannya dengan menggunakan awk sebagai berikut, tetapi, tidak yakin mengapa sed tidak memberikan hasil yang diinginkan.

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

Jawaban:

12

[oracle.*]berarti "salah satu karakter o, r, a, c, l, e, ., atau *". Akibatnya, regex Anda hanya akan cocok dengan sesuatu seperti

lib+c.txt

dan bukan nama file aktual yang Anda lewati. Jika Anda menghapus [dan ]dari regex, maka itu akan berfungsi dengan baik:

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

Namun, cara yang lebih sederhana untuk melakukannya adalah

basename lib/oracle-11.2.0.3.0.txt .txt

atau, jika Anda benar-benar menginginkan file tersebut berasal stdin:

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

Berikut adalah beberapa cara untuk melakukan ini:

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

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

Bagaimana kalau menggunakan cut

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