从 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 一起工作,只需稍作调整。)
我在 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 一起工作,只需稍作调整。)