小编Kyl*_*and的帖子

正则表达式 `/pattern/g` 和 ed `:g/pattern/`:哪个先出现,为什么是 `g`?

g选项(例如s/pattern/replacement/g对于许多工具使用正则表达式风格的模式匹配和):g的命令edexvi,并vim有相当类似的使用和意义:匹配给定的正则表达式“全球”,即第一比赛结束后不停止。

我对此有两个问题:

  • 哪个先出现,是:g命令还是g模式匹配标志,在哪个工具中?看起来大多数在模式匹配中sed使用g标志的工具(例如)实际上只是直接或间接模拟ed。例如,在后 Perl 时代,大多数使用正则表达式的工具都允许g标记,因为 Perl允许,而 Perl 会出现,因为ed-> sed-> Perl。因此,如果答案是“它们是在原始ed工具中同时引入的,并且除此之外没有历史先例”,我也不会感到惊讶。
  • 为什么将其称为global选项(或命令)?它真的没有什么“全球性”的;该:g命令与任何其他ed命令一样采用一系列行,并且该g标志不会以任何方式扩展搜索范围(它只允许多次点击)。我想我想不出更好的名字,但所选的名字对我来说似乎很奇怪,所以我想知道是否有一些我没有看到的原因。

sed history regular-expression ed

8
推荐指数
2
解决办法
1813
查看次数

强制 Bash 4 'globstar' 选项忽略符号链接

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,其中第二个非常糟糕。)

有什么想法吗?

bash zsh symlink glob

7
推荐指数
2
解决办法
1933
查看次数

在编辑器中自动打开文本文件而不是尝试运行它们?

当我在没有某种编辑器命令的情况下不小心键入文本文件的名称,并且该文本文件不是 shell 脚本时,我会收到“权限被拒绝”错误*,因为该文件不可执行,并且文件中的第一个标记命令行被视为要执行的命令。

然而,这总是意味着我无意中忘记输入我的编辑器命令,所以如果 shell 能够以某种方式识别第一个标记是一个没有设置“执行”位的现存文本文件并自动打开它会很方便无论是$EDITOR$VISUAL

有没有办法在 Bash 或 Zsh 中实现这一点?(我使用 Bash,但无论如何我都在考虑切换。)这有点像 Bash 的autocd选项,它会自动检测第一个标记是否是目录并尝试cd进入它,而不是给出标准的“是目录”错误。

理想情况下,如果我给出文件列表(例如带有 glob)或任何其他参数集,所有这些参数都将传递给编辑器命令。

* 当然,如果我在当前目录中指定一个没有./.

shell bash zsh

4
推荐指数
1
解决办法
2437
查看次数

标签 统计

bash ×2

zsh ×2

ed ×1

glob ×1

history ×1

regular-expression ×1

sed ×1

shell ×1

symlink ×1