Bash 中一组字符串中最后一个斜杠和下一个 space 之间的正则表达式

Regex between last slash and next space in a set of strings in Bash

我在输出中有一堆字符串

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

正则表达式详细信息:

  • [^/\s]+:匹配 1+ 个不是 / 且不是空格的字符
  • (?=\s|$):确保我们在当前位置之前有一个空格或行尾

如果 gnu grep 不可用试试这个 awk:

awk '{for (i=1; i<=NF; ++i) {sub(/.*\//, "", $i); print $i}}' <<< "$s"

通过 GNU grep,您可以使用

grep -oP '/\K\w++(?!/)' <<< "$s"
grep -oP '/\K\w++(?!/)' file

regex demo

详情:

  • -o - 提取匹配项,而不是匹配模式的整行
  • P - 启用 PCRE 正则表达式引擎
  • / - / 字符
  • \K - 从 match
  • 中省略匹配的 /
  • \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

也就是说,遍历所有以空格分隔的字段,删除所有直到最后一个 /(包括它)并打印剩余的字段值。