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
详情:
-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
也就是说,遍历所有以空格分隔的字段,删除所有直到最后一个 /
(包括它)并打印剩余的字段值。
我在输出中有一堆字符串
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
详情:
-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
也就是说,遍历所有以空格分隔的字段,删除所有直到最后一个 /
(包括它)并打印剩余的字段值。