我需要从.sql文件名中提取一些数字: 来自“TDB_full_335.51_2013_02_14.sql”我只想要“2013_02_14” 我可以用:
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”
答案 0 :(得分:0)
查找.sql
的{{1}}文件夹中的所有Downloads
个文件,并仅打印日期:
2013
如果您不希望被限制在$ find ~/Downloads -name "*.sql" | sed -r 's/.*(2013.*).sql/\1/'
2013_02_14
年:
2013
答案 1 :(得分:0)
您可以轻松匹配2013及以后的所有0-9
和_
grep -o '\(2013[0-9_]*\)'
从长远来看,使用2013
硬编码可能不是一个好主意,所以你可能想要使用类似的东西;
grep -o '\(2[0-9]\{3\}_[0-9_]*\)'
...匹配以2开头的任何4位数年份。
答案 2 :(得分:0)
你可以使用类似的东西:
grep -o '[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}'
答案 3 :(得分:0)
另一个sed
示例:
find -name '*.sql' \
| sed 's/.*_\(\([0-9]*_\)\{2\}[0-9]*\)\.sql$/\1/'
或者,如果您使用的是sed
的GNU版本,则可以传递-r
选项。然后,您无需转义{}
和()
:
find -name '*.sql' \
| sed -r 's/.*_(([0-9]*_){2}[0-9]*)\.sql$/\1/'
答案 4 :(得分:0)
echo "TDB_full_335.51_2013_02_14.sql" | awk '{print substr($0,match($0,/2013/),10)}'
2013_02_14