2010-06-29 127 views
0

我想提取字符串的某个部分(如果存在)。我对xml文件名感兴趣,即我想要“_”和“.xml”之间的什么。bash脚本中的sed regexp

这是确定,它打印“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" 

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

谢谢!

回答

2

如果找不到匹配项,您只需告知sed即可关闭它。 -n选项用于此。

MYSTRING=`echo "/sdd/ee/publ/xmlfile_555.xml" | sed -n 's/^.*_\([0-9]*\)\.xml/\1/p'` 

我只是做了两个改变你有什么:上述-n选项seds///命令,它告诉sed只打印如果置换成功完成输出后到来的p标志。

编辑:我也逃过了最后.正如评论中所建议的。

+0

太棒了!谢谢! – Jojje 2010-06-29 11:56:36

+1

你可能也想逃避最后的'''.' – 2010-06-29 12:21:06

+0

@Douglas:真的,我没有注意到(这就是为什么你不复制和粘贴代码;-) – 2010-06-29 18:03:55

0

试试这个吗?

basename /sdd/ee/publ/xmlfile_555.xml | awk -F_ '{print $2}' 

输出是555.xml

随着另一个。

basename /sdd/ee/publ/xmlfile.xml | awk -F_ '{print $2}' 

输出是一个空字符串。

+0

-1这不会产生在第一种情况下 – 2010-06-29 18:06:06

+0

正确的输出这并不意味着是一个“开箱即用解决方案的”尽可能多的可能的方法,但是,是的,your're权。 – 2010-06-30 06:20:26

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