7

ファイル名とパスが入力されたbash変数があります。

SONG="~/Music/Mine/Cool Title Bro.flac"

タグ付けを劇的に簡単にするために、変数に少し変換を適用して、タイトルを分離しました。

echo "${SONG#\~/Music/Mine/}" # which prints: Cool Title Bro.flac

接尾辞を削除することも可能${SONG%%.flac}です。

しかし、1回の操作でプレフィックスとサフィックスの両方を削除することは可能ですか?

これ:

${SONG#\~/Music/Mine/%%.flac}

%%.flacプレフィックスの一部としてリテラルを一致させようとするため、おそらく機能しません。逆は機能しません(%%.flac#~/[...])、そして私は夢中になって試しました

${${SONG#~/Music/Mine/}%%.flac}

これも機能しません。

これは私の側の過剰設計の典型的な例かもしれませんが、これを行う方法があれば素晴らしいでしょうし、私はまだそれを理解していません。

4

5 に答える 5

3

場合によっては、bashの拡張パターンは、必要なことを達成するのに十分な柔軟性があります。まず、それらをオンにする必要があります。

shopt -s extglob

次に、パラメータ展開を使用して削除する必要があるパターンのリストを指定できます。

echo ${SONG//@(*\/|.*)}

拡張パターンは、/までのすべて(パラメーター置換構文の一部と混同しないようにエスケープする必要があります)、またはピリオドとそれに続くすべてのパターンのいずれか@(*\/|.*)に一致します。は、パターンの各出現を置換する必要があることを示します。//

于 2012-06-20T12:31:18.517 に答える
3
echo "1:"
if [[ "$SONG" =~ \~/Music/Mine/(.*)\.flac ]] ; then SONG=${BASH_REMATCH[1]} ; fi
echo $SONG

echo "2:"
[[ "$SONG" =~ \~/Music/Mine/(.*)\.flac ]] && SONG=${BASH_REMATCH[1]}
echo $SONG

1と2はbash正規表現を使用します。else最初の例には、文字列が期待される形式と一致しない場合にブランチに割り込むことができるという追加の利点があります。*2番目の例は少しすっきりしています。どちらの場合も、${SONG}パターンと一致しない場合は変更されません。

ただし、awkまたはsedを使用すると理解しやすい場合があります。例えば:

echo "3:"
SONG=$(echo "$SONG" | sed -r 's:~/Music/Mine/(.*)\.flac:\1:')
echo $SONG

[*]ブランチの取得に使用する方法については、以下のDennisWilliamsonのメモを参照してください。||else

于 2012-06-20T08:30:09.803 に答える
2

いいえ、できません。2つの操作を使用します。

tmp="${SONG#\~/Music/Mine/}"; echo "${tmp%.flac}"

さて、あなたがナッツなら、それは可能です。

a="~/Music/Mine/Cool Title Bro.flac"
echo "${a:b=$(b=${a%${a#\~/Music/Mine/}};echo ${#b}):$(c=${a%.flac};echo ${#c})-b}"

それをサポートするシェルで正規表現のグループ化を使用することもできます。jedwards回答の例

ksh93パターンのグループ化を使用して実行することもできます。

song='~/Music/Mine/Cool Title Bro.flac'; echo "${song/'~/Music/Mine/'+(*).flac/\1}"
于 2012-06-20T08:29:26.477 に答える
0

私があなたの質問を誤解しなかったことを願っています。「CoolTitleBro」を分離したいですか?もしそうなら、

$ echo "~/Music/Mine/Cool Title Bro.flac"
~/Music/Mine/Cool Title Bro.flac
$ echo "~/Music/Mine/Cool Title Bro.flac"|sed 's/.*\/\(.*\).flac/\1/'
Cool Title Bro

少しの正規表現で管理できないものはありません。または代わりに

$ echo "~/Music/Mine/Cool Title Bro.flac"|sed 's/.*\/\(.*\)\..*/\1/'
Cool Title Bro

任意のファイル拡張子で動作します。

于 2012-06-21T08:52:33.217 に答える
-1

1行だけでそれを行う必要があり、読みやすさを気にしない場合は、使用します

echo "${SONG:13:${#SONG} - 18}"

どこ

  • 13は文字列「〜/ Music /Mine/」の長さです
  • 18は、文字列「〜/ Music /Mine/」の長さに「.flac」の長さを加えたものです。

bashでのこの文字列操作のより簡単なアプリケーションは次のとおりです。

$ TEST="1234567890"
$ echo ${TEST:3}
4567890
$ echo ${TEST:3:4}
4567
于 2012-06-20T08:49:01.070 に答える