如何从BASH中的字符串中删除所有非数字字符?

Ayu*_*hra 39 linux bash shell terminal ubuntu

例:

file="123 hello"
Run Code Online (Sandbox Code Playgroud)

如何编辑字符串文件,使其仅包含数字并删除文本部分?

所以,

echo $file
Run Code Online (Sandbox Code Playgroud)

应该file只打印.

fed*_*qui 76

这是一种方式sed:

$ echo $file | sed 's/[^0-9]*//g' 
123
$ echo "123 he23llo" | sed 's/[^0-9]*//g'
12323
Run Code Online (Sandbox Code Playgroud)

或者纯粹的bash:

$ echo "${file//[!0-9]/}" 
123
$ file="123 hello 12345 aaa"
$ echo "${file//[!0-9]/}" 
12312345
Run Code Online (Sandbox Code Playgroud)

要将结果保存到变量本身,请执行

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

$ file=${file//[!0-9]/}
$ echo $file
123
Run Code Online (Sandbox Code Playgroud)

  • 为了完整性,您还可以使用纯bash格式将结果保存回相同的变量中:`file = $ {file // [!0-9] /}。另外,通常可以用* command *`<<<`* something *代替`echo`* something *`|| * command **。 (2认同)

dev*_*ull 6

你可以说:

echo ${file%%[^0-9]*}
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下会遇到问题:

$ file="123 file 456"
$ echo ${file%%[^0-9]*}
123
Run Code Online (Sandbox Code Playgroud)

使用tr:

$ file="123 hello 456"
$ new=$(tr -dc '0-9' <<< $file)
$ echo $new
123456
Run Code Online (Sandbox Code Playgroud)

  • @devnull,我希望我可以发表评论.这里没有人身攻击的地方. (5认同)
  • @devnull我只是没有理解提出一个明显不正确的解决方案的目标,然后转身并提供一个正确的解决方案,然后评论你自己的答案断言它有一些特别错误.也许这是一种教学技巧,而不是一个笑话,但无论哪种方式,我担心它完全超越了我的头脑. (3认同)
  • 我给这个答案+1.第一种解决方案在一些简单的情况下可能是有用的,例如OP提供的例子.所以,我没有看到提出这个解决方案的任何问题,虽然我倾向于总是使用`sed`.此外,devnull已经警告过第一个解决方案的局限性,并给出了另一个运行良好的解决方案.更多解决方案,更多财富. (2认同)