ファイルのデフォルト名を削除し、ディレクトリ部分を保持します。

ファイルのデフォルト名を削除し、ディレクトリ部分を保持します。

次の文字列があります。

dir/subdir/othersubdir/file.txt

しかし、次のように見えるかもしれません。

dir/file.txt

または

dir/subdir/file.txt

$Pディレクトリのフルパスを持つスクリプトを作成していますfile.txt

今私はこれを使う

sed 's/\/.*txt//g'

txtとinで終わりを変えてください/。このようなものがあればうまくいきますdir/file.txtが、他の例では機能しません。自分が好きなようにするにはどうすればよいですか?

以前のサブディレクトリと一致させたくありません.*txt。ファイルのデフォルト名を削除したいと思います。

答え1

使用に固執しない場合は、sed次の使用を検討できますdirname

S="dir/subdir/othersubdir/file.txt"
P=$(dirname $S)
echo $P
dir/subdir/othersubdir

S="dir/file.txt"
P=$(dirname $S)
echo $P
dir

答え2

これはsedコマンドです:

$ P="dir/subdir/othersubdir/file.txt"
$ sed -r 's/^(.*)\/.*\.txt$/\1/' <<< $P
dir/subdir/othersubdir

上記のコマンドでは、sedキャプチャグループと呼ばれる変数の先頭からすべてをキャプチャし、周囲に使用されている角かっこのペアのためにベイカーとして参照され、sedコマンドの置き換えでキャプチャされたグループのみを印刷します。逆参照を使用します。.*^P$/*.txt\1(.*)

答え3

zshもっと単純な生活を送っている場合は、:h修飾子を使用してください。

$ var='dir/subdir/othersubdir/file.txt'
$ echo "$var:h"
dir/subdir/othersubdir

答え4

使用幸せ(以前のPerl_6)

~$ raku -ne 'put IO::Spec::Unix.splitpath($_).[1];'    file.txt

#OR(Unixの場合)

~$ raku -ne 'put .IO.dirname;'    file.txt

RakuはPerlファミリーのプログラミング言語です。上記の最初のコード例はファイルパスを取得し、それをIOオブジェクトとして扱います。オブジェクトには4つの主要クラス(Unix、Windows、Cygwin、およびQNX)があります。ファイルはUnixパスで構成されているため、パスIO::Spec::Unix区切り文字などを正しく理解するためにこのメソッドが呼び出されます。たとえば、これらの別々の関数を使用すると、UnixシステムでWindowsパスを操作できます。その後、パスはsplitpathボリューム、パス、およびファイル名の3つの部分に分けられます(インデックスは.[1]ファイル名を提供します)。

Unixでは、このコードはput .IO.dirname;

入力例:

dir/subdir/othersubdir/file.txt
dir/subdir/file.txt
dir/file.txt

出力例:

dir/subdir/othersubdir
dir/subdir
dir

https://docs.raku.org/type/IO/Spec/Unix
https://docs.raku.org/routine/dirname
https://raku.org

関連情報