バックスラッシュで始まるまたは始まる文字列を見つけて置き換える正規表現

バックスラッシュで始まるまたは始まる文字列を見つけて置き換える正規表現

私の音楽ライブラリには、次の形式の曲のタイトルを含む編集アルバムがありますが、スラッシュのためにこれらのファイルを作成するのはARTIST/ TITLE難しいです。だから私はこれらのファイルの名前を変更して管理しやすくしたいと思いました。これが私が今まで持っているものです:cpmvTitle (Artist)

#! /bin/bash

for i in ./*.flac; do
TITLE=`ls "$i" | sed #display string after backslash`
ARTIST=`ls "$i" | sed #display string before backslash`

mv ./"$i" ./"$TITLE ($ARTIST)"

done

また、スラッシュの後にスペースがあり、状況がARTIST/ TITLE混乱する可能性があることを覚えておいてください。

答え1

あなたの質問は次のとおりです。

文字列を含むbash変数があります。文字列の前と後の2つの部分に分けたいと思います"/ "

もしそうなら、単純なbashソリューションは次のようになります。

track="Judy Garland/ Somewhere Over the Rainbow"
title="${track#*/ }"
artist="${track%%/ *}"

文法は、#「...と一致する最短の接頭辞はありません」を意味します。文法は%%「一致する最も長いサフィックスがありません...」を意味します。 (同様に、##プレフィックスは最も長く、サフィックスは最短でなければなりません%。)パターンは通常のbash glob(shopt -s extglobまたは有効な場合は拡張bash glob)です。これはいいえ正規表現。

パターンが一致しない場合、文字列は変更されていない状態で返され、特にスラッシュの後にスペースがあるかどうかわからない場合は、条件を確認する必要があります。


しかし、なぜ使用するのですかls "$i"?もちろん、これは「here-string」を$i使用できる値と変わりません。echo

sed '# some sed magic' <<<"$i"

関連情報