我在bash中删除我的字符串/数组中的数字元素(转换很容易)时遇到问题。诀窍是,在数组中我有包含数字和其他字符的元素,我想保留它们。
所以
VAR="a2b a22 12b 417 900 600 86400 3600"
输出应为
"a2b a22 12b"
我能走得最远的地方是:
echo ${VAR}# | sed 's/ [0-9][0-9]*[$ ]/ /g'
但它仍然没有解决问题。我尝试在一个数组中完成它,但没有" $"和" ^"我无法阻止删除"好元素的某些部分"。
任何人都可以帮助我吗?
答案 0 :(得分:3)
您的代码存在两个问题。一个是[$ ]
将匹配一个字面的美元符号,但是,正如人们可能希望的那样,它不符合行尾。另一个是,虽然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配合使用,只需稍作调整。)