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

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

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
    

1

Bagaimana kalau menggunakan cut

echo "lib/oracle-11.2.0.3.0.txt" | cut -c5-19
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.