将其名称与通配符匹配后打印目录路径

print dir path after matching its name with wildcards

一直被这个小谜题困扰。预先感谢您的帮助。

我有一个目录路径,想在匹配后打印它的路径。

喜欢

echo /Users/user/Documents/terraform-shared-infra/services/history_book_test | awk -F "terraform-|tfRepo-" '{print $(NF)}'

echo /Users/user/Documents/tfRepo-shared-infra/services/history_book_test | awk -F "terraform-|tfRepo-" '{print $(NF)}'

输出:

shared-infra/services/history_book_test

shared-infra/services/history_book_test

当我尝试在 terraform-* 中添加通配符时,它不起作用。

我想在与 terraform-* 或 tfRepo* 匹配后打印路径。 喜欢:

services/history_book_test
services/history_book_test/../.. so on.

使用 sed:

echo /Users/user/Documents/terraform-shared-infra/services/history_book_test | sed 's|.*terraform.\([^/]*\)/.*||'
shared-infra

尝试过使用 awk 和 grep 的不同方法,但没有成功。我可以尝试的任何线索或想法。请。

谢谢。

你在混淆 regular expressions with globbing patterns。两者都有通配符,看起来很相似,但含义和用途却截然不同。 grep、sed 和 awk 等文本处理工具使用正则表达式来匹配输入字符串中的文本,而 shell 使用 globbing 模式来匹配 file/directory 名称。例如,正则表达式中的 foo* 表示 fo 后跟零个或多个附加 o,而通配模式中的 foo* 表示 foo 后跟零个或多个其他字符(在正则表达式中为 foo.*)。所以永远不要只说“通配符”,为了清楚起见,说“regexp wildcard”或“globbing wildcard”。

这可能是您想要做的,使用具有 -E arg 的 sed 来启用 ERE,例如GNU 或 BSD sed:

$ sed -E 's:.*/(terraform|tfRepo)-[^/]*/::' file
services/history_book_test
services/history_book_test

或使用任何 awk:

$ awk '{sub(".*/(terraform|tfRepo)-[^/]*/","")} 1' file
services/history_book_test
services/history_book_test

关于您对 sed sed 's|.*terraform.\([^/]*\)/.*||' 的尝试 - 如果您要使用 / 以外的字符作为分隔符,请不要使用像 | 这样的字符正则表达式或反向引用元字符充其量只会混淆您的代码,请选择一些始终是文字的字符,例如:.