2017-02-18 6 views
1

でパスからプレフィックス私は、フォームのファイルパスを持っている:削除サフィックスだけでなく、bashの

../healthy_data/F35_HC_532d.dat 

私はこのことからF35_HC_532dを抽出したいです。単一のコマンドでは、私は両方を削除し、私がしたい部分のみを抽出することが可能であろうように、私はこれらを組み合わせることができますどのように

for i in ../healthy_data/*; do echo ${i#../healthy_data/}; done # REMOVES PREFIX 

for i in ../healthy_data/*; do echo ${i%.dat}; done # REMOVES SUFFIX 

:私はbashでこのファイル名から接頭辞と接尾辞を削除することができますか?あなたがこのおよび印刷キャプチャグループ#1のように、このためにBASHの正規表現を使用することができます

+0

すべてのファイルは '.dat'で終わりますか? – hek2mgl

+0

@ hek2mgl:はい! – Peaceful

+0

[OK]を私の答えを確認して – hek2mgl

答えて

1

、それは

for i in ../healthy_data/* 
do 
    stringNeeded=$(awk -F/ '{split($NF,temp,"."); print temp[1]}' <<<"$i") 
    printf "%s\n" "$stringNeeded" 
done 

-F/分割入力、非常に単純です文字列が/の場合、$NFはその場合の文字列の最後のフィールドを表します。F35_HC_532d.dat、今度はsplit()関数がデリミタで呼び出されます. o dotの前に部品を取り出します。

上記のAwkのオプション/機能は、POSIXと互換性があります。


bashは、ネストされたパラメータの拡張をサポートしていません。また、あなたが2倍に段階的に以下のようなものに変更する必要があります。 - シングルループで

tempString="${i#*/*/}" 
echo "${tempString%.dat}" 

を、

for i in ../healthy_data/*; do tempString="${i#*/*/}"; echo "${tempString%.dat}" ; done 

2つ折り構文の場合、"${i#*/*/}"部分はを変数tempStringに格納し、その変数に01を削除します部分は"${tempString%.dat}"

+0

答えをありがとう。しかし、私の質問は、どのように私はbashでAwkのような他のものを使用する代わりに2つのコマンドを組み合わせることができますです。何か案は? – Peaceful

+0

@Peaceful:私が言ったように、これを達成するもう一つの方法です。 'Awk'はほとんどの主要なLinux/Unixプラットフォームにインストールされていることを覚えておいてください。そうすれば、あなたはそのような小さな仕事に使うことができます。 – Inian

+0

最後のコマンドは私が望むものです。 – Peaceful

5

:あなたはAwkを使用できる場合

for file in ../healthy_data/*; do 
    [[ $file =~ .*/([_[:alnum:]]+)\.dat$ ]] && echo "${BASH_REMATCH[1]}" 
done 
+0

これは簡単です!あなたはあなたが答えとして書いたものの意味を理解するための参考文献を教えてもらえますか? – Peaceful

+0

申し訳ありません私はいくつかの仕事のために逃げなければなりませんでした。 [こちらの記事をチェックしてください](http://www.linuxjournal.com/content/bash-regular-expressions)純粋なBASH機能を使うことは、 'sed/awk' – anubhava

+0

はい。私はこれを念頭に置いていました。御時間ありがとうございます。 – Peaceful

0

これを1ステップとして数えますか?

for i in ../healthy_data/*; do 
    sed 's#\.[^.]*##'<<< "${i##*/}" 
done 
0

すべてのファイルは、あなたがbasenameコマンドを使用することができます(あなたが確認されたように).datで終了している場合:(!)がある場合

basename -s .dat /path/to/files/* 

が多く、それらのファイルのfindを使用することは避けるために引数リストが長すぎるエラー:などについては

find /path/to/files -maxdepth 1 -name '*.dat' -exec basename -s .dat {} + 

どんな数の.datファイルが2番目のコマンドを使用すれば対処する必要がある地獄のスクリプト!

0

単一のパラメータ展開で接頭辞と接尾辞の両方を削除することはできません。

ただし、これはパラメータ展開操作のみを使用して1つのループで実行できます。接頭辞を削除した展開を変数に保存し、拡張子をもう一度使用して接尾辞を削除するだけです。

for file in ../healthy_data/*; do 
    prefix_stripped="${file##*\/healthy_data\/}" 
    echo "${prefix_stripped%.dat}" 
done 
関連する問題