首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除非数值。

删除非数值。
EN

Stack Overflow用户
提问于 2014-07-27 11:45:07
回答 4查看 6.9K关注 0票数 0

我只需要保留以'ab‘开头的行,在’ab‘和'cd’之间没有字母。从这些行中,我需要删除'ab‘和'cd’。

输入:

代码语言:javascript
复制
abI am jhoncd
ab32.58cd
abI live in USAcd
ab22. I was born in NYcd
ab58.2cd
ef

产出:

代码语言:javascript
复制
32.58
58.2

谢谢伙计们!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-27 11:49:30

通过awk,

代码语言:javascript
复制
$ awk '/^ab[^a-z]+cd$/{gsub(/ab/,""); gsub(/cd/,""); print}' file

代码语言:javascript
复制
$ awk '/^ab[^[:alpha:]]+cd$/{gsub(/ab/,""); gsub(/cd/,""); print}' file
32.58
58.2

上面的awk命令搜索以ab开头的行,后面跟着一个或多个字母(或字母)字符,最后是字符串cd。如果找到了,则通过awk的内置ab函数删除字符串cdgsub。最后,将结果重定向到标准输出。

模式解释:

  • ^断言我们处于行的开头。
  • ab与字符串ab匹配。
  • [^a-z]+与任何不属于a-z的字符匹配一次或多次。
  • cd与字符串cd匹配。
  • $线的末端。
票数 0
EN

Stack Overflow用户

发布于 2014-07-27 12:55:12

代码语言:javascript
复制
$ sed -n -r 's/^ab([^[:alpha:]]+)cd/\1/p' file
32.58
58.2

$ awk '/^ab([^[:alpha:]]+)cd/{gsub(/ab|cd/,""); print}' file
32.58
58.2

不过,我怀疑你真正想要的是:

代码语言:javascript
复制
$ sed -n -r 's/ab([[:digit:].]+)cd/\1/p' file
32.58
58.2

$ awk '/ab([[:digit:].]+)cd/{gsub(/ab|cd/,""); print}' file
32.58
58.2

也就是说,不要按要求删除包含字母的行,而是选择只包含ab和cd之间的数字和句点的行。

票数 1
EN

Stack Overflow用户

发布于 2014-07-27 11:47:37

使用grep:

代码语言:javascript
复制
grep -oE '[0-9]+[.][0-9]+' file

其他形式:

代码语言:javascript
复制
grep -oE '[[:digit:]]+[.][[:digit:]]+' file
grep -o '[0-9]\+[.][0-9]\+' file

另一种用于awk的:

代码语言:javascript
复制
awk '{ while (match($0, /[0-9]+[.][0-9]+/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART + RLENGTH) } }' file

更新

代码语言:javascript
复制
grep -oE '[0-9]+([.][0-9]+)?' file

awk '{ while (match($0, /[0-9]+([.][0-9]+)?/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART + RLENGTH) } }' file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24980591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档