回答:
bashの文字列操作の使用:
$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3
したがって、必要な文字列は次のようになります(先頭のスラッシュを追加し直します)。
b="/${a#/*/*/}"
変数の場合a
、${a#foo}
最短の文字列の一致を削除しますfoo
から開始しますa
。そのため/
、絶対パスの最初の2つのコンポーネントを削除するために、3つを含む最短の文字列(パスの先頭のスラッシュを含む)を削除します。
以下は使用例です cut
echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4-
folder1/folder2/folder3
行送り/
が必要な場合| sed 's/^/\//'
は、行の最後に追加できます。
フィールド間の区切り文字として使用するように指示する-f4-
ために必要です。したがって、最初のフィールドは最初の区切り文字の前に来ます。この場合、最初のフィールドは空です。だから、4番目のフィールドであり、以降4日からすべてのフィールドを使用するようにカットを伝えます。-d '/'
cut
/
folder1
-f4-
次のようにbashパラメーター展開を使用できます。
target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"
この後:
echo $myvar
与える:
/folder1/folder2/folder3
シェルパラメーター展開構文/*/*/
を使用して、target_path変数からパターンの最初の一致を削除することで機能し${target_path#pattern}
ます。残念ながら、これにより最初の/
文字が削除されるため、myvar変数の設定中にその文字を明示的に含める必要があります。
警告:このメソッドを使用する前に、target_path変数に文字が含まれており、2つのパスセグメントより長いことを確認する必要があります。たとえばif target_path=/home/username/
、then myvar=/
。のようなものを実行している場合、これはシステムにとって危険ですrm -rf "$myvar"*
。これを試さないでください!
/home/username
、実際$HOME
起動するユーザーのディレクトリには?もしそうなら、あなたは、単に使用して、それを削除することができmydir="${target_path#$HOME}"
、私は思う