私はbashスクリプトを書いていますが、時々これが起こります。
$path="things useless things... path/another/files1/useful/path/here"
そのため、「files1」の前のすべての単語とテキストを削除し、files1の後ろの部分(含む)を取得しようとします。
この例では、次のようになります。files1/useful/path/here
それ以降の部品は入手できますが、ファイル1は含まれません。
どうやってこれを達成できますか?
答え1
(ファイルスクリプトの場合)どうですか?
sed -n 's#\(path="\).*/\(files1/[^"]*"\)#\1\2#p' script
または値が変数の内部にある場合:
$ path="things useless things... path/another/files1/useful/path/here"
$ echo "/files1/${path##*/files1/}"
/files1/useful/path/here
答え2
次の構文を使用して、変数の前で${var#pattern}
最も短い一致を削除できます。pattern
$ path="things useless things... path/another/files1/useful/path/here"
$ echo "${path#*another/}"
files1/useful/path/here
あるいは、標準のテキスト解析ツールを使用することもできます。たとえば、
$ newPath=$(sed -E 's|.*(files1/)|\1|'<<<"$path")
$ echo $newPath
files1/useful/path/here
答え3
これを使用しているので、内蔵bash
正規表現エンジンを使用することもできます。
$ path="things useless things... path/another/files1/useful/path/here"
$ [[ "$path" =~ /files1/.*$ ]] && echo "$BASH_REMATCH"
/files1/useful/path/here