我只需要保留以'ab‘开头的行,在’ab‘和'cd’之间没有字母。从这些行中,我需要删除'ab‘和'cd’。
输入:
abI am jhoncd
ab32.58cd
abI live in USAcd
ab22. I was born in NYcd
ab58.2cd
ef产出:
32.58
58.2谢谢伙计们!
发布于 2014-07-27 11:49:30
通过awk,
$ awk '/^ab[^a-z]+cd$/{gsub(/ab/,""); gsub(/cd/,""); print}' file或
$ awk '/^ab[^[:alpha:]]+cd$/{gsub(/ab/,""); gsub(/cd/,""); print}' file
32.58
58.2上面的awk命令搜索以ab开头的行,后面跟着一个或多个字母(或字母)字符,最后是字符串cd。如果找到了,则通过awk的内置ab函数删除字符串cd和gsub。最后,将结果重定向到标准输出。
模式解释:
^断言我们处于行的开头。ab与字符串ab匹配。[^a-z]+与任何不属于a-z的字符匹配一次或多次。cd与字符串cd匹配。$线的末端。发布于 2014-07-27 12:55:12
$ 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不过,我怀疑你真正想要的是:
$ 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之间的数字和句点的行。
发布于 2014-07-27 11:47:37
使用grep:
grep -oE '[0-9]+[.][0-9]+' file其他形式:
grep -oE '[[:digit:]]+[.][[:digit:]]+' file
grep -o '[0-9]\+[.][0-9]\+' file另一种用于awk的:
awk '{ while (match($0, /[0-9]+[.][0-9]+/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART + RLENGTH) } }' file更新
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) } }' filehttps://stackoverflow.com/questions/24980591
复制相似问题