私がこれを持っているとしましょう:
str="@test/string"
echo $str
@test/string
echo ${str#@}
test/string
期待どおりに動作しますが、
echo ${str//\//-}
ksh: ${str//\//-}: bad substitution
失敗する。 (@test-string 期待)
このような文字を変更または変更する正しい方法は何ですか?
echo $KSH_VERSION
KSH version @(#)PD KSH v5.2.14 99/07/13.2
ベストアンサー1
例${var//pattern/replacement}
はksh93演算子ですが、pdkshは最後のバージョンksh88i1である元のkshのレプリカとして使用されます。 pdkshはプロジェクトとして中断されましたが、sh
OpenBSDやMirBSDを含む少数のBSDの一部としてまだ存在しています。 mkshとも呼ばれるMirBSD sh / kshはポータブルシェルとしても維持されており、多くのLinuxディストリビューション(Androidでも利用可能sh
)で利用できます。 2008 R33 リリースでは ksh93 演算子が追加されました。
POSIXlyでは、変数の1つの文字を別の文字に置き換えるためにtr
ansliteratorユーティリティを使用できますが、stdinで変数の内容を提供し、stdoutから結果を取得する必要があります。
newstr=$(printf %s "$str" | tr / -; echo .)
newstr=${newstr%.}
.\n
(これはコマンド置換が末尾の改行を削除するという事実を説明するために追加されました)。
別のコマンドを実行したくない場合は、分割+glob演算子を使用することもできます。
IFS=/ # split on /
set -o noglob # disable the glob part
set -- $str'' # split+glob by leaving $str unquoted
IFS=. # join on . in "$*"
newstr="$*"
1 ksh93は以前のバージョンと完全に互換性がありませんが、多くの新機能を備えた書き換えですが、その多くはまだ実験的で、2000年代にコードがオープンソースとしてリリースされる前にはほとんど使用されていません。