从 bash 中的 array/string 中删除仅数字元素

Deleting number only elements from an array/string in bash

我在 bash 中从我的 string/array(转换很容易)中删除纯数字元素时遇到问题。诀窍是,在数组中我有包含数字和其他字符的元素,我想保留它们。

所以

VAR="a2b a22 12b  417 900 600 86400 3600"

输出应该是

"a2b a22 12b"

我能走的最远的是:

echo ${VAR}# |  sed 's/ [0-9][0-9]*[$ ]/ /g'

但还是没有解决问题。我尝试在数组中执行此操作,但没有“$”和“^”我无法阻止删除 "good elements" 的某些部分。

有人可以帮我吗?

您的代码有两个问题。一个是 [$ ] 将匹配文字美元符号,但正如人们可能希望的那样,不匹配行尾。另一个是,虽然 g 表示全局匹配,但匹配不允许重叠,这将需要它按你想要的方式工作。

如果你有 GNU sed,那么一个简单的解决方案是避免匹配空格,而是使用 \<\> 来标记单词边界:

$ echo ${VAR} |  sed -E 's/\<[0-9][0-9]*\>/ /g'
a2b a22 12b     

或者,如果没有 GNU 扩展,您可以使用循环:

$ echo ${VAR} |  sed 's/^[0-9][0-9]* / /; :a; s/ [0-9][0-9]* / /g; t a; s/ [0-9][0-9]*$/ /'
a2b a22 12b 

代码:a表示一个标签。代码 t a 表示测试。如果先前的替换命令确实进行了替换,则 sed 跳转到标签 a.

(以上是在 GNU sed 下测试的。它应该与 BSD/OSX sed 一起工作,只需稍作调整。)