web-dev-qa-db-ja.com

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

[Oracle.*]は、「1つの文字 o、 r、 a、 c、 l、 e、 .、または *"したがって、正規表現は次のようなものにのみ一致します

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
12
rici

これを行うには、さらにいくつかの方法があります。

  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およびbash

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

cutの使用について

echo "lib/Oracle-11.2.0.3.0.txt" | cut -c5-19
1
jrnetclueless