在unix shell脚本中从子句到字母索引长度的子串

时间:2013-12-31 08:22:05

标签: shell substring

我有字符串说,

a =“abc_def ghi__333_31122013_Monthly.pdf”

我需要每月子句和31122013来自shell脚本中的上述字符串。基本上从最后一个子串到第一个'_'的索引。

欢迎任何帮助或建议。

纳瓦迪普

3 个答案:

答案 0 :(得分:2)

使用awk:

a="abc_def ghi__333_31122013_Monthly.pdf"
awk -F '[_.]' '{print $(NF-2), $(NF-1)}' <<< "$a"
31122013 Monthly

在BASH中使用IFS:

IFS=[_.] && arr=($a)
l=${#arr[@]}
echo ${arr[$l-3]}
31122013
echo ${arr[$l-2]}
Monthly

答案 1 :(得分:2)

如果您要移除_31122013_Monthly,其中31122013是可变的,您可以使用这样的替换:

$ a="abc_def ghi__333_31122013_Monthly.pdf"
$ echo ${a/_????????_Monthly}
abc_def ghi__333.pdf

如果另一方面你真的想要这个:

  

基本上从最后一个字符串到'_'的第一个索引。

然后,你可以这样做:

$ echo ${a/_*_}
abcMonthly.pdf

或者如果你想在_之前切断31122013_Monthly.pdf,那么你可以:

$ echo ${a#*__*_}
31122013_Monthly.pdf

答案 2 :(得分:0)

如果你真的想要删除下划线和下面的字母标记之间的最后八位数序列,直到完全停止之前,请尝试类似

的内容
ext=${a##*.}
echo ${a%_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_*}.$ext

(这不完全准确;它会用8个数字替换带有下划线的尾部,然后重新加上延伸部分。)