shell如何剪掉部分字符串()

时间:2015-08-13 18:04:16

标签: string shell

我有一些字符串......其中一些字符串中的字符更少......这里有一些例子。

ABC_DEF_GHI_JKL_${COD}_${DATE}
ABC_DEF_${COD}_${DATE}
ABC_${COD}_${DATE}

我必须做一个功能,我必须切出$ {COD}和一个_。所以新的字符串变成了

ABC_DEF_GHI_JKL_${DATE}
ABC_DEF_${DATE}
ABC_${DATE}

其中$ {COD}是一个数字...介于1和300之间。但是在字符串中有时在$ {COD}之前的中间有数字。 唯一可靠的部分是它们的结尾是_${COD}_${DATE} 有没有人知道怎么做?

3 个答案:

答案 0 :(得分:1)

在POSIX shell中,您可以使用

date=${str##*_}
tmp=${str%_$date}
cod=${tmp##*_}
str=${tmp%_$cod}_${date}

bash(或支持类似数组语法的其他shell)中,您可以使用

IFS=_ read -a parts <<< "$str"
cod=${parts[${#parts[@]}-2]}
# Or in bash 4.3, cod=${parts[-2]}
str=${str/_$cod_/_/}

答案 1 :(得分:0)

这是一个sed版本:

sed -n 's/\(.*\)_\(.*\)_\(.*\)$/\1_\3/p' filename

贪婪地匹配后缀并在替换

中删除不需要的部分(\ 2)

答案 2 :(得分:0)

这是一个核心Unix工具版本:

in=AAA_BBB_123_654_20151207             # input string
n=`echo $in | grep -o _ | wc -l`        # index of field to remove     (here: 4)
nm1=`expr $n - 1`                       # index before field to remove (here: 3)
np1=`expr $n + 1`                       # index after field to remove  (here: 5)
out=`echo $in | cut -d_ -f-$nm1,$np1-`  # remove n-th field from string

结果:

echo $out
AAA_BBB_123_20151207