echo "/dir1/dir2/filename.txt" | sed ????
出力を取得するためのSed式は何ですか
/dir1/filename.txt
これを達成するための他の簡単な方法があれば、それも大歓迎です。
あなたはそれを行うことができますcut
:
$ echo "/dir1/dir2/filename.txt" | cut -d/ -f1,2,4
/dir1/filename.txt
sed
それは少し混乱しています:
$ echo "/dir1/dir2/filename.txt" | sed 's/^\(\/.*\)\(\/.*\)\(\/.*\)/\1\3/'
/dir1/filename.txt
with の一部を取得し、必要なもの 1 と 3 を with で出力/text
するという考え方です。\(\/.*\)
\1\3
これはうまくいくはずですawk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/'
:
$ echo "/dir1/dir2/filename.txt" | awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/'
/dir1/filename.txt
ここでの利点は、スクリプトがフィールドの数に依存しないため、フォルダーの数に関係なく、ファイルは常に親ディレクトリに移動されることです。
$ echo "/a/b/c/d/e/f/filename.txt" | awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/'
/a/b/c/d/e/filename.txt
最後から 2 番目のフィールド$(NF-)
を最後のフィールドに設定し、フィールド$NF
の数を減らすことで機能しますNF--
。
Sidharth C Nadhan はこのエコー "/dir1/dir2/filename.txt" を言いました | sed 's//\w*//2' ですが、読みやすくするには '!' を使用します (または、他の何か)。
$ echo "/dir1/dir2/filename.txt" | sed 's!/\w*/!/!'
/dir2/filename.txt
's!/\w*/!/!' 意味 /\w*/ を /\w に置き換えます。これは単語文字であり、* は任意の数字を意味します。「!」セパレーターです。解決策はすでに受け入れられていましたが、これを追加しましたが、これは非常に見栄えが悪いので、検討する価値があると思います。
また、これが bash スクリプトで使用する場合、bash もこの機能に優れており、bash に組み込まれているため、同じプロセスにあり、はるかに効率的です。
$ f="/dir1/dir2/filename.txt"; echo $f; echo ${f/dir2\//}
/dir1/dir2/filename.txt
/dir1/filename.txt
残念ながら、セパレータとして / 以外のものを使用することはできません。また、\w、[^/]*、[a-z0-9]* などを機能させる方法がわかりません。その点では、bash は sed ほど良くありません。私は bash について十分に知りません。
sed を使用:
echo "/dir1/dir2/filename.txt" | sed 's:^\(.*\)/[^/]\+\(/[^/]\+\)$:\1\2:'
これにより、最後のディレクトリの名前が削除されます。
これはあなたのために働くかもしれません:
echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/.*\(\/.*\)/\1\2/'
また
echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/[^/]*\//\1\//'
echo "/dir1/dir2/filename.txt" | sed 's/\/\w*//2'