var=123456
echo "${var#"${var%???}"}"
###OUTPUT###
456
首先从中移除最后三个字符,$var
然后从移除$var
结果中移除-返回的最后三个字符$var
。以下是一些更具体的示例,旨在说明如何执行此操作:
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%???}"}")
这样一来,您只会获得紧接最后一个/
in之后第一个句点之前的三个字符$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
?