0

jdk-1.6.0_30-fcs.x86_64以下をに分割したかったのjdk-1.6.0_30です。私は次のことを試しましたsed 's/\([a-z][^fcs]*\).*/\1/'が、最終的にはjdk-1.6.0_30-. 間違った方法でアプローチしていると思います。単語の終わりから開始して、遭遇するまで後方にトラバースする方法はあり-ますか?

4

3 に答える 3

1

これをやってみてください:

echo 'jdk-1.6.0_30-fcs.x86_64' | sed 's/-fcs.*//'

、またはを使用している場合は、次のことができます。

var=jdk-1.6.0_30-fcs.x86_64
echo ${var%%-fcs*}
jdk-1.6.0_30

後のソリューションは、Linux および Minix3 でテストされたパラメーター展開を使用します

于 2012-11-07T21:26:46.990 に答える
1

正確ではありませんが、 を使用してパターンを文字列の末尾に固定できます$。次に、繰り返す文字にハイフンが含まれていないことを確認する必要があります。

echo jdk-1.6.0_30-fcs.x86_64 | sed 's/-[^-]*$//'

これは-文字列の a から末尾まで一致しますが、その間のすべての文字は異なるものでなければなり-ません (最初のハイフンに既に一致しないようにするため)。

もう少し詳しい説明。-エンジンは、最初にリテラルを照合しようとします。それは最初-に文字列の最初で機能します(明らかに)。次に、可能な限り[^-]*多くの非文字に一致するため、-消費します1.6.0_30(次の文字は実際にはハイフンであるため)。これで、エンジンは に一致させようとし$ますが、文字列の最後にいないため、一致しません。バックトラッキングが発生しますが、ここでは無視できます。最後に、エンジンは最初の一致を放棄-し、文字列を続行します。次に、エンジンはリテラル-を 2 番目の と照合し-ます。[^-]*を消費しますfcs.x86_64。今、私たちは実際に文字列の最後にいて、$一致するため、完全一致 (削除されるものは)-fcs.x86_64です。

于 2012-11-07T21:27:06.030 に答える
1

使う cut>>

echo 'jdk-1.6.0_30-fcs.x86_64' | cut -d- -f-2
于 2012-11-07T21:30:53.783 に答える