首页 > 解决方案 > 将正则表达式从 bash 转换为 zsh

问题描述

我最近将 macOS 更新为新的 Catalina 版本,并按照建议从 bash 切换到 zsh。问题是在我的工作流程中,我们做了一些需要正则表达式的文件操作,但我不知道如何使它与 zsh 一起工作。

这是我的两个正则表达式:

ls | grep ^[0-9].*.chunk.js$
ls | grep ^main.*.chunk.js$

它们应与以下文件匹配:main.d9a85e98.chunk.js2.c2cbac0f.chunk.js

有什么想法或资源吗?

谢谢!

标签: regexbashzshmacos-catalina

解决方案


grep引用正则表达式以防止在看到字符串之前尝试对其进行外壳扩展。

# Ignoring the issue of parsing the output of ls
ls | grep '^[0-9].*.chunk.js$'
ls | grep '^main.*.chunk.js$'

正则表达式通常可以解释为 shell 模式,bashzsh运行命令之前都会尝试扩展。两种 shell 都可以选择将不匹配的模式视为错误或文字字符串。默认情况下,bash将其视为文字字符串,而zsh将其视为错误。在任一 shell 中要做的“正确”事情是引用一个您绝对打算将其扩展为模式的字符串。bash只是让你更频繁地摆脱它。

bash中,这是由failglob选项控制的,默认情况下是关闭的。

zsh中,它由NOMATCH选项控制,默认为开启。

zsh还具有更丰富的模式语言,因此可能不会导致模式匹配的字符串可以bashzsh. 结果是一样的:grep看不到你想要的论点。


推荐阅读