var=123456
echo "${var#"${var%???}"}"
###OUTPUT###
456
最初に最後の3文字を$var
削除してから$var
、その削除の結果から削除します$var
。これにより、最後の3文字が返されます。そのようなことをどのように行うかを示すことをより具体的に目的としたいくつかの例を次に示します。
touch file.txt
path=${PWD}/file.txt
echo "$path"
/tmp/file.txt
base=${path##*/}
exten=${base#"${base%???}"}
base=${base%."$exten"}
{
echo "$base"
echo "$exten"
echo "${base}.${exten}"
echo "$path"
}
file
txt
file.txt
/tmp/file.txt
これを非常に多くのコマンドで広げる必要はありません。これを圧縮できます:
{
base=${path##*/} exten=
printf %s\\n "${base%.*}" "${exten:=${base#"${base%???}"}}" "$base" "$path"
echo "$exten"
}
file
txt
file.txt
/tmp/file.txt
txt
シェルパラメータの組み合わせ$IFS
と組み合わせるset
ことも、シェル変数を解析およびドリルするための非常に効果的な方法です。
(IFS=. ; set -f; set -- ${path##*/}; printf %s "${1#"${1%???}"}")
それはあなたが唯一の3つの文字はすぐに最後に続く最初の期間、先行取得します/
では$path
。あなたが最初の三文字だけを取得したい場合は、すぐに最後の直前.
での$path
(複数の可能性がある場合には、例えば.
ファイル名には):
(IFS=.; set -f; set -- ${path##*/}; ${3+shift $(($#-2))}; printf %s "${1#"${1%???}"}")
どちらの場合でも次のことができます。
newvar=$(IFS...)
そして...
(IFS...;printf %s "$2")
...後に続くものを印刷します .
外部プログラムを使用してもかまわない場合は、以下を実行できます。
printf %s "${path##*/}" | sed 's/.*\(...\)\..*/\1/'
\n
ファイル名に改行文字が含まれる可能性がある場合(ネイティブシェルソリューションには適用されません-とにかくすべて処理されます):
printf %s "${path##*/}" | sed 'H;$!d;g;s/.*\(...\)\..*/\1/'
file.one.two.three
か?欲しいですile
かtwo
?