我有两根弦
"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+
),然后匹配一个或多个空白字符,最后再匹配一个或多个数字或.
。
结合起来,这些应该与您描述的两种情况相匹配,尽管很难知道,因为您只给出了两个简单的示例。通过-o
GNU 选项grep
,我们仅打印每行的匹配部分。