2013-08-16 32 views
0

我需要從一個.sql文件名中提取一些數字:從「TDB_full_335.51_2013_02_14.sql」 我只希望「2013_02_14」 我能得到這樣的:找到一個4位數字,並得到文本之後他們

echo $(find -s ~/Downloads | grep -e '\.sql' | awk -F/ '{print $NF}' | sed -n '/TDB_full/p' | awk 'END{print}' | awk '{gsub(".sql", "");print}' | cut -d "_" -f4 -f5 -f6) 

這是現在可以,但如果文件名長度改變這將失敗。有沒有辦法搜索4位數字「2013」​​並獲得「.sql」之後的數字?

,如果發現這一點:

grep -o '\([[:digit:]]\)\{4\}' 

,但給我的只有 「2013」​​

+1

我不認爲肯·湯普森與UNIX哲學不得不考慮到這一點。這是我見過的最糟糕的管道之一。 –

回答

0

發現在Downloads文件夾中的所有.sql文件2013並打印日期:

$ find ~/Downloads -name "*.sql" | sed -r 's/.*(2013.*).sql/\1/' 
2013_02_14 

如果你不想限制爲年份2013

$ find . -name "*.sql" | sed -r 's/.*([0-9]{4}_[0-9]{2}_[0-9]{2}).sql/\1/' 
2013_02_14 
0

你可以很容易地匹配2013年和所有以下0-9_;

grep -o '\(2013[0-9_]*\)' 

使用2013硬編碼可能不從長遠看是一個好主意,所以你可能想使用類似;

grep -o '\(2[0-9]\{3\}_[0-9_]*\)' 

...匹配任意4位年開始用2

0

您可以使用類似的東西:

grep -o '[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}' 
0

另一個sed例如:

find -name '*.sql' \ 
| sed 's/.*_\(\([0-9]*_\)\{2\}[0-9]*\)\.sql$/\1/' 

或者,如果您使用的是GNU版本sed,則可以通過-r選項。然後,你將不需要逃避{}()

find -name '*.sql' \ 
| sed -r 's/.*_(([0-9]*_){2}[0-9]*)\.sql$/\1/' 
+0

非常感謝! :)) –

0
echo "TDB_full_335.51_2013_02_14.sql" | awk '{print substr($0,match($0,/2013/),10)}' 
2013_02_14 
相關問題