grep 包含数字的单词

grep 包含数字的单词

我有两根弦

"Some Special xn39432n4 (foo bar)"
"Another thing goes 21 deer 14.5"

sed,我想要这个输出

xn39432n4
21 deer 14.5

表示所有包含数字(从第一次出现到最后一次出现)的空格分隔单词以及它们之间的非数字单词。

答案1

也许是这样的:

sed -n '
  s/\([^[:space:]]*[[:digit:]][^[:space:]]*\(.*[[:digit:]][^[:space:]]*\)\{0,1\}\).*/\
\1/
  s/.*\n//p' < your-file

space它匹配包含至少一个digit可选 ( )的非白色序列,\{0,1\}后跟任何字符序列,后跟一个数字以及space其后的所有非白色。

这是在 中捕获的\1,我们丢弃 ( ) 之后的字符.*并在其之前插入一个换行符,我们在下一个命令中将其与其前面的内容一起丢弃s

答案2

你可以使用 GNU 来做到这一点grep

$ grep -oP '\w+[.\d]+\w+|[.\d]+\s+\w+\s+[.\d]+' file 
xn39432n4
21 deer 14.5

这两个正则表达式是:

  • \w+[.\d]+\w+:匹配一个或多个单词字符(\w+匹配 az、AZ 和_),然后匹配一个或多个数字或.字符 ( [.\d]+),然后再次匹配一个或多个单词字符 ( \w+)。
  • [.\d]+\s+\w+\s+[.\d]+':匹配一个或多个数字或.字符 ( [.\d]+),然后匹配一个或多个空白字符 ( \s+),然后再匹配一个或多个单词字符 ( \w+),然后匹配一个或多个空白字符,最后再匹配一个或多个数字或.

结合起来,这些应该与您描述的两种情况相匹配,尽管很难知道,因为您只给出了两个简单的示例。通过-oGNU 选项grep,我们仅打印每行的匹配部分。

相关内容