Linux 如何在Bash中从字符串中删除所有非数字字符?

Linux 如何在Bash中从字符串中删除所有非数字字符?,linux,bash,shell,ubuntu,terminal,Linux,Bash,Shell,Ubuntu,Terminal,例如: file="123 hello" 如何编辑字符串文件,使其仅包含数字,并删除文本部分 所以 应仅打印123。这是sed的一种方式: $ echo $file | sed 's/[^0-9]*//g' 123 $ echo "123 he23llo" | sed 's/[^0-9]*//g' 12323 或者使用纯bash: $ echo "${file//[!0-9]/}" 123 $ file="123 hello 12345 aaa" $ echo "${file//[!0-

例如:

file="123 hello"
如何编辑字符串
文件
,使其仅包含数字,并删除文本部分

所以


应仅打印
123

这是sed的一种方式:

$ echo $file | sed 's/[^0-9]*//g' 
123
$ echo "123 he23llo" | sed 's/[^0-9]*//g'
12323
或者使用纯
bash

$ echo "${file//[!0-9]/}" 
123
$ file="123 hello 12345 aaa"
$ echo "${file//[!0-9]/}" 
12312345
要将结果保存到变量本身,请执行以下操作

$ file=$(echo $file | sed 's/[^0-9]*//g')
$ echo $file
123

$ file=${file//[!0-9]/}
$ echo $file
123
你可以说:

echo ${file%%[^0-9]*}
但是,在某些情况下,这会遇到问题:

$ file="123 file 456"
$ echo ${file%%[^0-9]*}
123
使用
tr

$ file="123 hello 456"
$ new=$(tr -dc '0-9' <<< $file)
$ echo $new
123456
$file=“123你好456”

$new=$(tr-dc'0-9'“某些情况”?
${file%%[^0-9]*}
将始终删除从第一个非数字到字符串末尾的所有内容。
%%
根本不是您想要的(也不是
%
)。我觉得我错过了一个笑话。亲爱的@MarkReed,我以为你说的话在答案中已经清楚了,或者没有?可能这就是建议采取另一种方法的原因。我错过了什么吗?@devnull我只是不明白在扭转局面之前提出一个明显不正确的解决方案的目的nd给出一个正确的答案,然后评论你自己的答案,声称它有严重的问题。也许这是一个教学技巧,而不是一个笑话,但不管怎样,我担心它完全超出了我的头脑。@devnull,我希望我能对评论投反对票。这里没有人身攻击的地方。我给这个答案加1第一种解决方案在一些简单的情况下可能很有用,比如OP提供的示例。因此,尽管我倾向于总是使用
sed
,但我认为提出这种解决方案没有任何问题。此外,devnull警告了第一种解决方案的局限性,并给出了另一种效果良好的解决方案。更多解决方案,更多解决方案为了完整性,您还可以使用纯bash格式将结果保存回同一个变量:
file=${file/[!0-9]/}
。另外,一般来说,你可以用command
Good point@MarkReed来替换
echo
something
|
命令。根据用户询问的类型,我宁愿让答案非常简单,因为
希望对版本字符串(例如
git version 1.7.1
)?使用
${gitVersion/[!0-9.]/}
并保留句点。出于好奇,为什么这个命令不删除字符串中的空白?这实际上是我想要的行为,但不理解为什么它是默认值。@LukeDavis不确定您尝试了什么,但我测试了它,它确实起作用:
file=“hola que tal 23”
然后
echo“${file/[!0-9]/}”
返回23。
$ file="123 hello 456"
$ new=$(tr -dc '0-9' <<< $file)
$ echo $new
123456