在某些脚本中,它会读取目录名称并获取类似
的内容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
所以马车控制角色似乎以某种方式嵌入那里。我怎么能摆脱这个并得到我想要的输出?
答案 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 /.$//'