我只需要保留以'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
thanx伙计们!
答案 0 :(得分:1)
$ 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之间的数字和句点的行。
答案 1 :(得分:0)
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) } }' file
答案 2 :(得分:0)
通过awk,
$ awk '/^ab[^a-z]+cd$/{gsub(/ab/,""); gsub(/cd/,""); print}' file
OR
$ 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
$
行尾。答案 3 :(得分:0)
这awk
可能会:
awk -F"ab|cd" '$2~/^[0-9.]+$/ {print $2}' file
32.58
58.2
编辑
如果您有awk
等,则上面的ab45.23ab
会失败。
这个gnu awk
会更好:
awk -F"cd" -v RS="ab" 'NF==2 && $1~/^[0-9.]+$/ {print $1}' file
32.58
58.2