我想提取字符串的某个部分(如果存在)。我对xml文件名感兴趣,即我想要“_”和“.xml”之间的内容。
没关系,打印“555”
MYSTRING=`echo "/sdd/ee/publ/xmlfile_555.xml" | sed 's/^.*_\([0-9]*\).xml/\1/'`
echo "STRING = $MYSTRING"
这不行,因为它返回整个字符串。在这种情况下,我不想要任何结果。 它打印“/sdd/ee/publ/xmlfile.xml”
MYSTRING=`echo "/sdd/ee/publ/xmlfile.xml" | sed 's/^.*_\([0-9]*\).xml/\1/'`
echo "STRING = $MYSTRING"
如何在第二种情况下获得“空”结果的任何想法。
谢谢!
答案 0 :(得分:2)
如果找不到匹配项,您只需告诉sed
关闭它。 -n
选项用于此目的。
MYSTRING=`echo "/sdd/ee/publ/xmlfile_555.xml" | sed -n 's/^.*_\([0-9]*\)\.xml/\1/p'`
我只对你所拥有的内容进行了两处更改:-n
前面提到的sed
选项,以及p
命令之后的s///
标志,它告诉{ {1}}仅在替换成功完成后才打印输出。
编辑:我也按照评论中的建议逃过了最后的sed
。
答案 1 :(得分:0)
试试这个?
basename /sdd/ee/publ/xmlfile_555.xml | awk -F_ '{print $2}'
输出为555.xml
另一个。
basename /sdd/ee/publ/xmlfile.xml | awk -F_ '{print $2}'
输出为空字符串。
答案 2 :(得分:0)
$ path=/sdd/ee/publ/xmlfile_555.xml
$ echo ${path##*/}
xmlfile_555.xml
$ path=${path##*/}
$ echo ${path%.xml}
xmlfile_555
$ path=${path%.xml}
$ echo ${path##*_}
555