sed を使用した文字列の一部の抽出

sed を使用した文字列の一部の抽出
ls lib/oracle-11.2.0.3.0.txt | sed 's/lib.\([oracle.*]\)\.txt/\1/'

.txtまで、Oracle部分だけでなく完全な文字列も提供します。私が何を間違っているのでしょうか?

以下のようにawkを使用してこれを実行できますが、sedが目的の結果を提供しない理由はわかりません。

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

答え1

[oracle.*]「文字、、、、、、、、oまたは」のrいずれかを表します。したがって、正規表現は次のように一致します。acle.*

lib+c.txt

実際のファイル名の代わりに渡します。正規表現からと[を削除すると]正常に動作します。

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

しかし、より簡単なアプローチは

basename lib/oracle-11.2.0.3.0.txt .txt

または、本当にファイルを次からインポートしたい場合stdin

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

答え2

これを行う追加の方法は次のとおりです。

  1. 真珠

    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そしてbash

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

答え3

使い方cut

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

関連情報