trích xuất một phần của chuỗi bằng sed


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

Nó đang đưa ra toàn bộ chuỗi thay vì chỉ một phần cho đến khi .txt Tôi đang làm gì sai?

Tôi có thể làm điều đó bằng cách sử dụng awk như sau, nhưng, không chắc tại sao sed không cho kết quả mong muốn.

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

Câu trả lời:


12

[oracle.*]có nghĩa là "một trong những nhân vật o, r, a, c, l, e, ., hoặc *". Do đó, regex của bạn sẽ chỉ phù hợp với một cái gì đó như

lib+c.txt

và không phải tên tệp thực tế bạn đang vượt qua nó. Nếu bạn loại bỏ []khỏi regex, thì nó sẽ hoạt động tốt:

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

Tuy nhiên, một cách đơn giản hơn nhiều để làm điều đó là

basename lib/oracle-11.2.0.3.0.txt .txt

hoặc, nếu bạn thực sự muốn tập tin đến từ stdin:

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

6

Dưới đây là một vài cách khác để làm điều này:

  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. basenamebash

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.