将其名称与通配符匹配后打印目录路径
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.\([^/]*\)/.*||'
的尝试 - 如果您要使用 /
以外的字符作为分隔符,请不要使用像 |
这样的字符正则表达式或反向引用元字符充其量只会混淆您的代码,请选择一些始终是文字的字符,例如:
.
一直被这个小谜题困扰。预先感谢您的帮助。
我有一个目录路径,想在匹配后打印它的路径。
喜欢
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.\([^/]*\)/.*||'
的尝试 - 如果您要使用 /
以外的字符作为分隔符,请不要使用像 |
这样的字符正则表达式或反向引用元字符充其量只会混淆您的代码,请选择一些始终是文字的字符,例如:
.