之前在linux上有个脚本,通过expr命令截取字符串的。大意如下:
a=/path/to/example
b=expr length "$a  "
c=/path/to/example/file/to/example
d=expr length "$c"
e=expr substr "$c" "$b" "$d"
转移到BSD后,脚本报错:expr: syntax error
分别在linux和bsd上man expr后对比了一下,发现bsd上的expr确实没有index、length、substr等运算,原来linux上的expr是GNU的;而bsd上的expr是POSIX的,没有gnu的那些扩展用法……
于是必须使用些通用的办法来完成这个截取功能。方法很多,举例如下:

1、awk法
awk ‘BEGIN{print length(‘$a’)}’;
awk ‘BEGIN{print substr(‘$c’,’$b’,’$d’)}’

2、bash扩展法
${#a}
${c:$b:${#c}}

3、标准expr+cut法
expr “$a  “ : “.*”
echo $c | cut -c $b-$d

POSIX下的expr没有length,不过man中提供了采用:匹配.*的方法获取长度;

GNU下的expr substr和awk的substr函数一样,都是从$b位开始,截取$d位数的字符子串;而cut命令则是从$b位开始截取到$d位为止的字符子串。

其实cut这种方法才是最符合前面的length的,不过substr的时候,位数多设一些,也不影响结果~~