0
echo "/dir1/dir2/filename.txt" | sed ????

出力を取得するためのSed式は何ですか

   /dir1/filename.txt

これを達成するための他の簡単な方法があれば、それも大歓迎です。

4

6 に答える 6

2

あなたはそれを行うことができます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

于 2013-04-25T09:54:27.507 に答える
1

これはうまくいくはずです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--

于 2013-04-25T10:10:42.747 に答える
0

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 について十分に知りません。

于 2013-04-25T20:39:25.807 に答える
0

sed を使用:

echo "/dir1/dir2/filename.txt" | sed 's:^\(.*\)/[^/]\+\(/[^/]\+\)$:\1\2:'

これにより、最後のディレクトリの名前が削除されます。

于 2013-04-25T10:02:15.900 に答える
0

これはあなたのために働くかもしれません:

echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/.*\(\/.*\)/\1\2/'

また

echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/[^/]*\//\1\//'
于 2013-04-25T10:04:31.547 に答える
0
 echo "/dir1/dir2/filename.txt" | sed 's/\/\w*//2'
于 2013-04-25T10:06:17.650 に答える