0

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

4

5 回答 5

0

You can match 2013 and all following 0-9 and _ easily;

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

Using 2013 hard coded may not be a good idea in the long run, so you may want to use something like;

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

...to match any 4 digit year starting with a 2.

于 2013-08-16T10:46:22.050 回答
0
echo "TDB_full_335.51_2013_02_14.sql"  | awk '{print substr($0,match($0,/2013/),10)}'
2013_02_14
于 2013-08-19T12:04:18.823 回答
0

你可以使用类似的东西:

grep -o '[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}'
于 2013-08-16T10:48:08.320 回答
0

另一个sed例子:

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

或者,如果您使用的是 GNU 版本,sed则可以传递该-r选项。然后你就不需要逃避{}and ()

find -name '*.sql' \
| sed -r 's/.*_(([0-9]*_){2}[0-9]*)\.sql$/\1/'
于 2013-08-16T10:51:22.240 回答
0

查找文件夹.sql中的所有文件并仅打印日期:Downloads2013

$ 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
于 2013-08-16T10:45:32.447 回答