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);}'
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
これを行うには、さらにいくつかの方法があります。
Perl
echo "lib/oracle-11.2.0.3.0.txt" | perl -pe 's/.+(oracle.+)\.txt/$1/'
sed
echo "lib/oracle-11.2.0.3.0.txt" | sed 's/.*\(oracle.*\)\.txt/\1/'
cut
echo "lib/oracle-11.2.0.3.0.txt" | cut -d'/' -f 2 | cut -d '.' -f 1-5
basename
そして bash
echo "lib/oracle-11.2.0.3.0.txt" | while read n; do
echo $(basename ${n/.txt//});
done
使ってみて cut
echo "lib/oracle-11.2.0.3.0.txt" | cut -c5-19