sedを使用して文字列の一部を抽出する


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

回答:


12

[oracle.*]手段"の文字の1 oracle.、または*"。その結果、あなたの正規表現は次のようなものにのみ一致します

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

6

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

  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
    

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.