读取目录名称的一部分,并使用sed或类似的东西摆脱托架控制

时间:2011-06-16 16:29:51

标签: string bash shell sed awk

在某些脚本中,它会读取目录名称并获取类似

的内容
66.9090_89.4450_168.0250_ABC3/

我需要提取“ABC3”这个东西,所以我试试

    sed -i -e "s/_/ /g" temp_direc 

所以我得到了

66.9090 89.4450 168.0250 ABC3/

然后

read LABEL <<< $(awk '{print $4}' temp_direc)

现在我得到了

ABC3/

但我不知道如何删除最后的“/”。此外,我稍后需要这样做

echo $A" "$LABEL

是一个像45.56

这样的字符串

我希望输出

45.56 ABC3

但我真的得到了

 ABC3/6

所以马车控制角色似乎以某种方式嵌入那里。我怎么能摆脱这个并得到我想要的输出?

6 个答案:

答案 0 :(得分:3)

sed解决方案是:

sed 's#.*_\([^_/]*\)\(/\|$\)#\1#'

RESP。使用GNU sed

sed -r 's#.*_([^_/]*)(/|$)#\1#'

我选择#作为分隔符(而不是通常的/),因为模式中有/,否则必须进行转义。

答案 1 :(得分:2)

尝试更简单:

echo '66.9090_89.4450_168.0250_ABC3/' | cut -d"_" -f4 | cut -d"/" -f1

产生ABC3

答案 2 :(得分:1)

不是100%肯定你在这之后的目标。但要获得ABC3,你已经有90%了:

$echo '66.9090_89.4450_168.0250_ABC3/' | awk -F'_' '{print $4;}' | sed 's/\///'
ABC3

答案 3 :(得分:1)

只有awk的解决方案:

read LABEL <<< $( echo '66.9090_89.4450_168.0250_ABC3/' \
                  | awk -F '[_/]' '{printf("%s", $4);}' )

Opss ...我认为该领域永远是第四位,以下几行没有这个限制:

read LABEL <<< $( echo '66.9090_89.4450_168.0250_ABC3/' \
                  | awk -F '[_/]' '{printf("%s", $(NF -1));}' ) ; echo $LABEL

答案 4 :(得分:1)

获取ABC3/6之类的输出表示您的$A以回车结束。您可以在输入文件中使用dos2unix之类的内容,或使用tr删除回车符:

A=$'45.56\r'
B="66.9090_89.4450_168.0250_ABC3/"

a=$( echo "$A" | tr -d $'\r' )   # remove all carriage returns

b=${B##*_}   # remove up to (and including) the last underscore
b=${b%/}     # remove a trailing slash 

echo "$a $b"  # ==> "45.56 ABC3" 

答案 5 :(得分:1)

  

echo '66 .9090_89.4450_168.0250_ABC3 /'   | sed -e's /^.*_//'-e's /.$//'