2017-09-29 7 views
0

specific_stringの後のすべてをBashのパス文字列で削除しようとしています。私はsedを使用してこれまでのところ役に立たなかった。私は、このようなsedなどのコマンドを使用する必要はありませんでした場合Bashは最初の文字列の後にすべてのオカレンスを削除します

variable="specific_string" 
input_string="/path/to/some/specific_string/specific_string.something/specific_string.something-else" 
output=$(sed 's/$variable//' $input_string) 

出力は"/path/to/some/specific_string/"

が良いだろうでなければなりません!

答えて

2

問題

多くの問題

があります。
  • 変数は一重引用符で評価されません。 's/$variable//'ないspecific_string

  • sedが含まれていない文字列リテラルとして扱われますファイルまたはSTDINからテキストを変更しますが、パラメータで指定されたテキストはできません。 sed 's/...//' $input_stringの場合、が開かれ、その内容はパス自体ではなく読み込まれます。

  • s/string//はその後だけstring、ない単語を削除します。

また、変数を二重引用符で囲んでください。変数にスペースが含まれていると、cmd $variableは危険です。 cmd "$variable"は安全です。

sedのソリューション

output="$(sed "s/$variable.*/$variable/" <<< "$input_string")" 

GNU Grepのソリューション

output="$(grep -Po "^.*?$variable" <<< "$input_string")" 

ピュアバッシュソリューション

output="${input_string%%$variable*}$variable" 
1

あなたはそれは、次の例にないとして、それはまた、「/」を削除します「specific_string」の後にすべてのものを削除する場合:

output=$(echo $input_string|sed "s/${variable}.*$/${variable}/") 
1

簡単なSEDで試してみてください。

variable="specific_string" 
input_string="/path/to/some/specific_string/specific_string.something/specific_string.something-else" 
output=$(echo "$input_string" | sed "s/\(.*$variable\/\).*/\1/") 

可変出力の出力は次のようになります。

echo $output 
/path/to/some/specific_string/ 
関連する問題