从字符串中提取数字

时间:2011-04-21 07:59:19

标签: sed awk grep

我有一个字符串ABCD20110420.txt,我想从中提取日期。预计 2011-04-20 我可以使用replace来删除文本部分,但是如何插入“ - ”?

# echo "ABCD20110420.txt" | replace 'ABCD' '' | replace '.txt' ''
20110420

5 个答案:

答案 0 :(得分:4)

只需使用shell(bash)

$> file=ABCD20110420.txt
$> echo "${file//[^0-9]/}"
20110420
$> file="${file//[^0-9]/}"
$> echo $file
20110420
$> echo ${file:0:4}-${file:4:2}-${file:6:2}
2011-04-20

以上内容适用于您的样本等文件。如果您有A1BCD20110420.txt这样的文件,则无效。

对于那种情况,

$> file=A1BCD20110420.txt    
$> echo ${file%.*} #get rid of .txt
A1BCD20110420
$> file=${file%.*}
$> echo "2011${file#*2011}"
20110420

或者您可以使用正则表达式(Bash 3.2 +)

$> file=ABCD20110420.txt
$> [[ $file =~ ^.*(2011)([0-9][0-9])([0-9][0-9])\.*$ ]]
$> echo ${BASH_REMATCH[1]}
2011
$> echo ${BASH_REMATCH[2]}
04
$> echo ${BASH_REMATCH[3]}
20

答案 1 :(得分:4)

echo "ABCD20110420.txt" | sed -e 's/ABCD//' -e 's/.txt//' -e 's/\(....\)\(..\)\(..\)/\1-\2-\3/'

阅读:sed FAQ

答案 2 :(得分:1)

echo "ABCD20110420.txt" | sed -r 's/.+([0-9]{4})([0-9]{2})([0-9]{2}).+/\1-\2-\3/'

答案 3 :(得分:0)

$ file=ABCD20110420.txt
$ echo "$file" | sed -e 's/^[A-Za-z]*\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)\.txt$/\1-\2-\3/'

这只需要一次调用sed。

答案 4 :(得分:0)

echo "ABCD20110420.txt" | sed -r 's/.{4}(.{4})(.{2})(.{2}).txt/\1-\2-\3/'