OS XでのBash 4.3サブストリングの負の長さ


12

Bash 4.2は、負のサブストリング長のサポートを追加しました。

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

例37-12。文字列抽出コンストラクトの負のパラメーター

「長さ」パラメーターが負の場合、それはオフセットからの終了パラメーターとして機能します。

たとえば、Ubuntuでテストすると、次のように「World」が出力されます。

STR="Hello World!"
echo ${STR:6:-1}

ただし、OS X(GNU bash、バージョン4.3.42(1)-release(x86_64-apple-darwin14.5.0))では、その使用により次のエラーが生成されます。

-1: substring expression < 0

これはOS X固有のものですか、それとも後のbashアップデートで再び無効になりましたか?OS Xでこの機能を有効にする方法はありますか?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2-v2、v3、v4から始まるときに追加されたものが続きます。
ハヌ

@Hannuはい、そのドキュメントは、負の長さのセマンティクスがバージョン4.2で追加されたと述べています
ブレントファウスト

私は同じ問題を抱えています:あなたはそれに対処する方法を見つけましたか?
ロマンジュアン

@romainjouinアルゴリズムを変更するだけです。この構文は、Bashバージョン4.3.46の時点でも、OX Xでは機能しません!これにもっと目を向けようとする質問に賛成票を投じてください。誰かが...答えを知っている
ブレント・ファウスト

1
@Rubistroただこれを打つ:| その方法の1つは(あなたの例では)echo "Hello World" | rev | cut -c -5 | rev
-donovanmuller

回答:


7

flabdabletのソリューションは固定長の文字列に対してのみ機能しますが、これを動的にサイズ変更された文字列のドロップイン置換として使用できます。

echo ${STR:6:$((${#STR} - 6 - 1))}

詳細に:

  • ${#STR} 文字列の長さを返します。
  • $((a - b - c)) 数学的な減算を行います
  • ${STR:start:len} 部分文字列を返します。

そのため、部分文字列式の2番目の引数は、文字列の長さから開始オフセットを引いたものを、新しいbash構文で負の値として指定する値を引いたものになります。


2

STRに少なくとも7文字が含まれることが保証されている場合、$ {STR:6:$ {#STR} -7}は$ {STR:6:-1}のドロップイン代替として機能するはずです。短くなる可能性がある場合、これにより、OS X bashが負の長さについて文句を言うか、負の長さを右からのオフセットとしてサポートするbashバージョンで恐ろしく間違った方向に進みます。


Thx、私のためにトリックをしました
ジャン=バーナードヤンセン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.