文字列の一部のみをbashの変数に割り当てる


11

ユーザーから特定の絶対ファイルパスを受け取り、ファイルパスの最初の 2つのコンポーネントのみを含むが、それを何も印刷しない文字列になる変数を作成したい。

たとえば、絶対パスは次のようになります。

/home/myusername/folder1/folder2/folder3

そして、それは「target_path」に保存されており、「mydir」は次のようにしたいだけです。

/folder1/folder2/folder3

cutコマンドをさまざまな方法で使用しようとしましたが、成功しませんでした。


/home/username、実際$HOME起動するユーザーのディレクトリには?もしそうなら、あなたは、単に使用して、それを削除することができmydir="${target_path#$HOME}"、私は思う
steeldriver

回答:


15

bashの文字列操作の使用:

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

したがって、必要な文字列は次のようになります(先頭のスラッシュを追加し直します)。

b="/${a#/*/*/}"

変数の場合a${a#foo}最短の文字列の一致を削除しますfooから開始しますa。そのため/、絶対パスの最初の2つのコンポーネントを削除するために、3つを含む最短の文字列(パスの先頭のスラッシュを含む)を削除します。


パスは30フォルダーである可能性があり、最後の28フォルダーのみを含めます。
パイの寿命

@Lifeofpiどうして?
ムル

9

以下は使用例です cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

行送り/が必要な場合| sed 's/^/\//'は、行の最後に追加できます。

フィールド間の区切り文字として使用するように指示する-f4-ために必要です。したがって、最初のフィールドは最初の区切り文字の前に来ます。この場合、最初のフィールドは空です。だから、4番目のフィールドであり、以降4日からすべてのフィールドを使用するようにカットを伝えます。-d '/'cut/folder1-f4-


7

次のように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"*これを試さないでください!


パスは30フォルダーで、最後の28フォルダーのみを含めたいのですが、これでも機能しますか?
パイの寿命

確かに、これはパスの長さに関係なく、最初の2つだけをトリミングします。
-Arronical
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.