该g选项(例如s/pattern/replacement/g对于许多工具使用正则表达式风格的模式匹配和):g的命令ed,ex,vi,并vim有相当类似的使用和意义:匹配给定的正则表达式“全球”,即第一比赛结束后不停止。
我对此有两个问题:
:g命令还是g模式匹配标志,在哪个工具中?看起来大多数在模式匹配中sed使用g标志的工具(例如)实际上只是直接或间接模拟ed。例如,在后 Perl 时代,大多数使用正则表达式的工具都允许g标记,因为 Perl允许,而 Perl 会出现,因为ed-> sed-> Perl。因此,如果答案是“它们是在原始ed工具中同时引入的,并且除此之外没有历史先例”,我也不会感到惊讶。global选项(或命令)?它真的没有什么“全球性”的;该:g命令与任何其他ed命令一样采用一系列行,并且该g标志不会以任何方式扩展搜索范围(它只允许多次点击)。我想我想不出更好的名字,但所选的名字对我来说似乎很奇怪,所以我想知道是否有一些我没有看到的原因。Bash 4 有一个很棒的选项,称为“globstar”,它模拟(即从)zsh 的**语法来跨多个目录进行通配符。但是,由于它始终遵循符号链接,因此它有点瘫痪(至少对于我的使用而言)。
有没有办法防止**跟随符号链接?如果没有,是否有计划在未来版本中将此功能添加到 Bash?在那之前(或者如果没有这样的计划),任何人都可以提出一个体面(和方便)的解决方法吗?
我想我已经读过 zsh 的实现更灵活并且没有这个问题,但不幸的是我不能只切换到 zsh,因为我们在我的工作场所获取了很多 bash 脚本,我没有时间或将它们全部转换为 zsh 并保持最新状态的诀窍。(我想可能可以启动 Bash 子shell,获取所需的脚本,然后以某种方式将所有更改的环境变量、别名、函数等反向移植到 zsh 中,但我也不知道该怎么做。)
我知道我可以使用find它来编写一个函数,它会按照我想要的方式运行,然后**为这个函数设置别名,但是我无法做类似的事情path/to/parent/**/child/paths并让它正常工作;我能得到的最接近的是类似$(** path/to/parent child/paths), where**是一个函数的别名,该函数将父路径作为第一个参数,然后--wholename */child/paths/*作为参数包含在find它构造和执行的命令中。这既尴尬又丑陋,我真的想要更好的东西。(特别是,我喜欢这种path/**/path格式很容易允许变化,path/**而且**/path很容易直观,而函数会将其分别转换为** path/和** '.' /path,其中第二个非常糟糕。)
有什么想法吗?
当我在没有某种编辑器命令的情况下不小心键入文本文件的名称,并且该文本文件不是 shell 脚本时,我会收到“权限被拒绝”错误*,因为该文件不可执行,并且文件中的第一个标记命令行被视为要执行的命令。
然而,这总是意味着我无意中忘记输入我的编辑器命令,所以如果 shell 能够以某种方式识别第一个标记是一个没有设置“执行”位的现存文本文件并自动打开它会很方便无论是$EDITOR或$VISUAL。
有没有办法在 Bash 或 Zsh 中实现这一点?(我使用 Bash,但无论如何我都在考虑切换。)这有点像 Bash 的autocd选项,它会自动检测第一个标记是否是目录并尝试cd进入它,而不是给出标准的“是目录”错误。
理想情况下,如果我给出文件列表(例如带有 glob)或任何其他参数集,所有这些参数都将传递给编辑器命令。
* 当然,如果我在当前目录中指定一个没有./.