Bash変数から最後のスラッシュの前のすべてのエントリを削除します。

Bash変数から最後のスラッシュの前のすべてのエントリを削除します。

myVarbashには、次の長い文字列を含む変数があります。

-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_

myVar最後のスラッシュ以前のすべてを削除したい(最後のスラッシュを含む)myVar最終的には保存されますbaz1234_。すべてを削除して結果を変数に保存するにはどうすればよいですか?

私はsedを扱う解決策を見つけましたが、その解決策はファイル処理を扱っているので、それは私の問題です。

答え1

使用する必要がありますbash パラメータ拡張これには、型の部分文字列の削除を使用します。${PARAMETER##PATTERN}

最初から -${PARAMETER##PATTERN}

この形式は、一致しようとしている文字列の先頭に記載されているパターンを削除します。彼らは##最長のテキストマッチングを使用してこれを実行しようとします。

あなたの例

$ myVar='-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_'
$ echo "${myVar##*/}"
baz1234_

コメントで指摘したように、問題の文字列はls変数内のコマンドの出力であるようです!これはスクリプトを書くのに理想的な方法ではありません。要件をより明確に説明します。

答え2

奇妙な解決策:

myVar='-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_'
myVar=$(echo "$myVar" |  awk -F '/' '{print $NF}')

しかし、他の人が指摘したように、lsの出力を変数として保存するのは良い考えではありません。スクリプトでより多くのコンテキストを提供できる場合は、より良いソリューションを提案できます。

答え3

コメントから:

それぞれに複数のファイルを含むtarアーカイブでいっぱいのフォルダがあります。 bazで始まり、数字が続き、最後にアンダースコア_が来る特定のファイルを取得するために繰り返します。

それでは、これがリストされた出力ですかtar tzvf foo.tar.gz、それとも似ていますか?私は(詳細なしで)を使用してファイル名を出力するだけなので、tarシェルを使用して出力を1行ずつ処理するのではなく、次のような操作を実行してファイル名を取得できます。tar t ...v

tar tzf foo.tar.gz |grep -E '/baz[0-9]+_$' |sed -e 's,.*/,,'

(またはコマンド置換でキャプチャします。filename=$(tar ... | sed ...)もちろん、sedパラメータ拡張で置き換えることもできます${filename##./}。)

関連情報