从字符串中提取数字

发布于 2024-11-02 19:17:38 字数 196 浏览 0 评论 0原文

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

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

I have a string ABCD20110420.txt and I want to extract the date out of it. Expected 2011-04-20
I can use replace to remove the text part, but how do I insert the "-" ?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

沒落の蓅哖 2024-11-09 19:17:39
echo "ABCD20110420.txt" | sed -r 's/.+([0-9]{4})([0-9]{2})([0-9]{2}).+/\1-\2-\3/'
echo "ABCD20110420.txt" | sed -r 's/.+([0-9]{4})([0-9]{2})([0-9]{2}).+/\1-\2-\3/'
谈下烟灰 2024-11-09 19:17:39
$ 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 进行一次调用。

$ 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/'

This only requires a single call to sed.

单挑你×的.吻 2024-11-09 19:17:39
echo "ABCD20110420.txt" | sed -r 's/.{4}(.{4})(.{2})(.{2}).txt/\1-\2-\3/'
echo "ABCD20110420.txt" | sed -r 's/.{4}(.{4})(.{2})(.{2}).txt/\1-\2-\3/'
痕至 2024-11-09 19:17:38

回显“ABCD20110420.txt”| sed -e 's/ABCD//' -e 's/.txt//' -e 's/\(....\)\(..\)\(..\)/\1-\ 2-\3/'

阅读:sed 常见问题解答

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

Read: sed FAQ

何处潇湘 2024-11-09 19:17:38

只需使用 shell (bash)

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

以上适用于像您的示例这样的文件。如果您有像 A1BCD20110420.txt 这样的文件,则不起作用。

对于这种情况,

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

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

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

Just use the shell (bash)

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

The above is applicable to files like your sample. If you have files like A1BCD20110420.txt, then will not work.

For that case,

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

Or you can use regular expression (Bash 3.2+)

gt; file=ABCD20110420.txt
gt; [[ $file =~ ^.*(2011)([0-9][0-9])([0-9][0-9])\.*$ ]]
gt; echo ${BASH_REMATCH[1]}
2011
gt; echo ${BASH_REMATCH[2]}
04
gt; echo ${BASH_REMATCH[3]}
20
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文