我在输出中有一堆字符串
adadds/asdsd/foo aeee/ggdgg/bar aff/ggg/ddafs/afdf/doo
从这里我需要以下列表
foo
bar
doo
我尝试了以下操作,但没有成功:
(?<=/)(.*?)(?=s)
和
([/])(.*?)(?=s)
使用gnu grep
:
s='adadds/asdsd/foo aeee/ggdgg/bar aff/ggg/ddafs/afdf/doo'
grep -oP '[^/s]+(?=s|$)' <<< "$s"
foo
bar
doo
RegEx详细信息:
[^/s]+
:匹配任何非/
且非空白字符的1+(?=s|$)
:确保在当前位置前面有空白或行尾
如果gnu grep
不可用,请尝试此awk
:
awk '{for (i=1; i<=NF; ++i) {sub(/.*//, "", $i); print $i}}' <<< "$s"
使用GNU grep,您可以使用
grep -oP '/Kw++(?!/)' <<< "$s"
grep -oP '/Kw++(?!/)' file
查看regex演示
详细信息:
-o
-提取匹配项,而不是与模式匹配的整行P
-启用PCRE正则表达式引擎/
-/
字符K
-从匹配中省略匹配的/
w++
-一个或多个所有格匹配的单词字符(?!/)
-右侧不允许立即出现/
(匹配失败,如果有/
,则不与w++
重新匹配(
使用awk
:
awk '{for (i=1; i<=NF; i++) {sub(/.*//,"",$i); print $i}}' <<< "$s"
awk '{for (i=1; i<=NF; i++) {sub(/.*//,"",$i); print $i}}' file
也就是说,迭代所有以空格分隔的字段,删除所有直到最后一个/
(包括它(的字段,并打印剩余的字段值。