在bash脚本中使用sed regexp

时间:2010-06-29 11:41:09

标签: bash unix sed

我想提取字符串的某个部分(如果存在)。我对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"

如何在第二种情况下获得“空”结果的任何想法。

谢谢!

3 个答案:

答案 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