次の文字列があります。
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