最後のスラッシュの前の行部分を取得します。

最後のスラッシュの前の行部分を取得します。

アルバムフォルダに「folder.jpg」のMPDアルバムカバーを表示するためのconkyスクリプトを作成しようとしています。私の現在の計画は、mpc -f %file%ファイル名とパスを印刷してから、実際のファイル名(つまり、最後/後のすべての項目)を切り取り、それをconkyのイメージオブジェクトへのパスとして使用することです。

grep/cut の使用に問題があります。特に、一部の曲は2つのフォルダに入れ子になっており、他の曲は1つのフォルダに入れ子になっているためです。 (grep -m 1 . |cut -f1 -d /シングルフォルダアルバムに適用可能)

どうすればいいですか?私が逃したより簡単な方法はありますか?

答え1

sed以下を使用して残りを削除できます。すべては最後のスラッシュで始まります:

mpc -f %file% | head -1 | sed 's:/[^/]*$::'

このパターンは、/[^/]*$行末までのスラッシュを除くすべての文字が続くスラッシュと一致します。空の文字列に置き換えられます。目的の行の後にあるいくつかのステータス出力を
無視してくださいhead -1。ただし、最初に印刷しない方法については、以下を参照してください。

sedに慣れていない場合は、このコマンドが:使用されている理由で奇妙に思えるかもしれません。たとえば、以前にsed区切り記号を付けたコマンドを見たことがあります。式にはそれ自体が含まれているため、読みやすくするために区切り文字を使用することをお勧めします。あるいは、式で - をエスケープすることもできますが、そうしても読みやすくなりません。/'s/foo/bar/'://'s/\/[^\/]*$//'


これを使用する方法に応じて、mpc2つの追加のステータス行が提供されます。自動オプションは-qすべての出力をオフにします。必要な行を取得するには、現在再生中のファイルを明示的に印刷することとそれを組み合わせる必要があります-qが、それはすべてです。

mpc -q -f %file% current | sed 's:/[^/]*$::'

削除する代わりにすべては最後のスラッシュで始まります、明示的に印刷できます。最後のスラッシュ以前のすべて:

mpc -q -f %file% current | sed 's:^\(.*\)/.*$:\1:'

後ろにaなどの文字が続くすべての文字と一致します。最後の文字が一致する/ようにできるだけ一致します。/

答え2

このルールを単一の文字列に適用するには、sed代わりに次を使用できます(他の回答を参照)dirname

$ dirname "1 2/3 4/5 6/file"
1 2/3 4/5 6

答え3

Grepは作業のための最後のツールではありません。grep -m 1 .空でない最初の行を印刷しますが、機能しません。 grepや他のツールを含む複雑なソリューションを構築できますが、最も簡単な方法は次のことです。sed。 1つの方法は、スラッシュではなく最後の実行文字と前のスラッシュを空の文字列に置き換えることです。

mpc -f %file% | sed 's:/[^/]*$::'

または、最後のスラッシュまですべてを保持し、次を削除します。

mpc -f %file% | sed 's:^\(.*\)\(/.*\)$:\1:'

どちらの方法も/入力内容が含まれていない場合、つまりディレクトリを表示せずにファイル名が渡された場合は、入力を変更せずに残します。これが問題なら、sedで解決できますが、dirname注文する:

dirname -- "$(mpc -f %file%)"

シェルスクリプトでは、次を使用することもできます。パラメータ拡張構成しますが、結果のみを印刷したい場合はより複雑です。

full_path="$(mpc -f %file%)"
case "$full_path" in
  */*) directory_part="${full_path%/*}"
  *) directory_part="."
printf '%s\n' "$directory_part"

関連情報