从文件名中提取数字

发布于 2024-12-03 07:07:57 字数 159 浏览 0 评论 0原文

在 BASH 中,我想使用 sed,但不知道如何提取模式而不是通常的替换。

例如:

FILENAME = 'blah_blah_#######_blah.ext'

密码数量(在上面的示例中用“#”替代)可以是 7 或 10

我只想提取数字

In BASH I thought to use sed, but can't figure how to extract pattern instead usual replace.

For example:

FILENAME = 'blah_blah_#######_blah.ext'

number of ciphers (in above example written with "#" substitute) could be either 7 or 10

I want to extract only the number

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

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

发布评论

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

评论(6

诺曦 2024-12-10 07:07:57

如果您需要删除除数字之外的任何内容,您可以使用

ls | sed -e s/[^0-9]//g

获取每个文件名分组的所有数字(123test456.ext 将变为 123456),或

ls | egrep -o [0-9]+

获取所有数字组(123test456.ext 将显示 123 和 456)

If all you need is to remove anything but digits, you could use

ls | sed -e s/[^0-9]//g

to get all digits grouped per filename (123test456.ext will become 123456), or

ls | egrep -o [0-9]+

for all groups of numbers (123test456.ext will turn up 123 and 456)

你对谁都笑 2024-12-10 07:07:57

您可以使用这个简单的代码:

filename=zc_adsf_qwer132467_xcvasdfrqw
echo ${filename//[^0-9]/}   # ==> 132467

You can use this simple code:

filename=zc_adsf_qwer132467_xcvasdfrqw
echo ${filename//[^0-9]/}   # ==> 132467
纵情客 2024-12-10 07:07:57

只需 bash:

shopt -s extglob
filename=zc_adsf_qwer132467_xcvasdfrqw
tmp=${filename##+([^0-9])}
nums=${tmp%%+([^0-9])}
echo $nums   # ==> 132467

或者使用 bash 4

[[ "$filename" =~ [0-9]+ ]] && nums=${BASH_REMATCH[0]}

Just bash:

shopt -s extglob
filename=zc_adsf_qwer132467_xcvasdfrqw
tmp=${filename##+([^0-9])}
nums=${tmp%%+([^0-9])}
echo $nums   # ==> 132467

or, with bash 4

[[ "$filename" =~ [0-9]+ ]] && nums=${BASH_REMATCH[0]}
独留℉清风醉 2024-12-10 07:07:57

文件名中是否还有其他数字?如果没有:

 ls | sed 's/[^0-9][^0-9]*\([0-9][0-9]*\).*/\1/g'

应该可以。

Perl one liner 可能会工作得更好一点,因为 Perl 只是具有更高级的正则表达式解析,并且使您能够指定数字范围必须在 7 到 10 之间:

ls | perl -ne 's/.*\D+(\d{7,10}).*/$1/;print if /^\d+$/;'

Is there any number anywhere else in the file name? If not:

 ls | sed 's/[^0-9][^0-9]*\([0-9][0-9]*\).*/\1/g'

Should work.

A Perl one liner might work a bit better because Perl simply has a more advanced regular expression parsing and will give you the ability to specify the range of digits must be between 7 and 10:

ls | perl -ne 's/.*\D+(\d{7,10}).*/$1/;print if /^\d+$/;'
岁月蹉跎了容颜 2024-12-10 07:07:57
$ ls -1
blah_blah_123_blah.ext
blah_blah_234_blah.ext
blah_blah_456_blah.ext

将此类文件放在您运行的目录中:

$ ls -1 | sed 's/blah_blah_//' | sed 's/_blah.ext//'
123
234
456

或使用单个 sed 运行:

$ ls -1 | sed 's/^blah_blah_\([0-9]*\)_blah.ext$/\1/'
$ ls -1
blah_blah_123_blah.ext
blah_blah_234_blah.ext
blah_blah_456_blah.ext

Having such files in a directory you run:

$ ls -1 | sed 's/blah_blah_//' | sed 's/_blah.ext//'
123
234
456

or with a single sed run:

$ ls -1 | sed 's/^blah_blah_\([0-9]*\)_blah.ext$/\1/'
流心雨 2024-12-10 07:07:57

这对你有用 -

echo $FILENAME | sed -e 's/[^(0-9|)]//g' | sed -e 's/|/,/g'

This will work for you -

echo $FILENAME | sed -e 's/[^(0-9|)]//g' | sed -e 's/|/,/g'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文