特定のNUMBER個のパスコンポーネントを削除する場合は、cut
と-d'/'
を使用する必要があります。例えば、path=/home/dude/some/deepish/dir
場合:最後の二つの成分(rev
は、文字列を反転)を除去する
$ echo $path | cut -d'/' -f-3
/home/dude
:最初の二つの成分を維持するために
# (Add 2 to the number of components to remove to get the value to pass to -f)
$ echo $path | cut -d'/' -f4-
some/deepish/dir
:
最初の二つの成分を除去するために:
$ echo $path | rev | cut -d'/' -f4- | rev
/home/dude/some
最後の3つのコンポーネントエント:
$ echo $path | rev | cut -d'/' -f-3 | rev
some/deepish/dir
それとも、あなたはsed
が働くだろう、特定のコンポーネントの前にすべてのものを削除する場合:
$ echo $path | sed 's/.*\(some\)/\1/g'
some/deepish/dir
または特定のコンポーネントの後:
$ echo $path | sed 's/\(dude\).*/\1/g'
/home/dude
それがあればさらに簡単です指定するコンポーネントを保持したくない場合は、
$ echo $path | sed 's/some.*//g'
/home/dude/
そして、あなたはあまりにも最後のスラッシュを一致させることができます一致するようにしたい場合:
$ echo $path | sed 's!/some.*!!g'
/home/dude
:もちろん
$ echo $path | sed 's/\/some.*//g'
/home/dude
を使用すると、複数のスラッシュにマッチしている場合、あなたはsed
区切り文字を切り替える必要がありますこれらの例はすべて絶対パスを使用しているため、それらを相対パスで動作させるために遊ぶ必要があります。
ありがとう...はい、これを実行するためにシェル変数を使用しています。両方の部分は変数で、削除する必要のある部分と完全なパスです。 – esausilva
優秀!しかし、文字列が「パイプから」来ているとき、これをどのように使用できますか? – gromit190
@Birger文字列がパイプから来ている場合は、シェル変数の拡張を使用するために、その変数に変数を取得する必要があります。その場合は 'sed'を使用してください。 –