找到一个4位数字并在其后面得到文本

时间:2013-08-16 10:39:40

标签: sed awk grep find digit

我需要从.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”​​

5 个答案:

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