之前在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”`
转移到FreeBSD后,脚本报错: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的时候,位数多设一些,也不影响结果~~