2010-06-29 133 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