1つ以上のスラッシュ以外の文字を一致させる方法

1つ以上のスラッシュ以外の文字を一致させる方法

n レベルの深さまで下がる相対パスが与えられ、同じ数のレベルまで上がる「逆」パスを生成したいと考えています。末尾のスペースの有無にかかわらず、同じ数のレベルを生成したいと考えています。例:

dir/subdir/subsubdir  should produce ../../..
dir/subdir/subsubdir/ should produce ../../../

プラス演算子が一致を見つけられないのはなぜですか? これは、1 つ以上のスラッシュ以外の文字を意味しているのではありませんか?

$ echo dir/subdir/subsubdir | sed 's|[^/]+|..|g'
dir/subdir/subsubdir

一方、単一の文字の一致の後に星印の一致が続く場合は機能します。

$ echo dir/subdir/subsubdir | sed 's|[^/][^/]*|..|g'
../../..

末尾にスラッシュがあっても:

$ echo dir/subdir/subsubdir/ | sed 's|[^/][^/]*|..|g'
../../../

ちなみに、プラス記号 (+) の代わりに星印 (*) を使用できます。

$ echo dir/subdir/subsubdir | sed 's|[^/]*|..|g'
../../..

しかし、末尾のスラッシュは別のレベルを追加するため、適切ではありません。

$ echo dir/subdir/subsubdir/ | sed 's|[^/]*|..|g'
../../../../..

答え1

残念ながら、正規表現構文にはさまざまな種類があり、それぞれにわずかな(またはそれほどわずかではない)違いがあります。GNU sed を使用している場合は、次のいずれかのオプションが機能します。

$ echo dir/subdir/subsubdir | sed 's|[^/]\+|..|g'
../../..
$ echo dir/subdir/subsubdir | sed -r 's|[^/]+|..|g'
../../..

一般的に、使用しているツールのマニュアル ページをチェックして、どのフレーバーを使用しているか確認する必要があります。

関連情報