【问题标题】:MacOS Terminal find and regex issueMacOS终端查找和正则表达式问题
【发布时间】:2018-06-26 07:34:38
【问题描述】:

在过去的 24 小时内,我花费了大量时间来尝试使该脚本正常工作。我在这里遇到了几个线程,这些线程指向正则表达式命令根本无法在终端中的 Mac 上运行。

find . -name '*.yml' -print0 | xargs -0 sed -i '' -e 's/^uuid.*\n/g'

此脚本应该遍历当前目录中的所有 yml 文件,并删除以 uuid 开头的行。

它根本不起作用。

我可以让它工作:

find . -name '*.yml' -print0 | xargs -0 sed -i '' -e 's/^uuid://g

但它只是从行中删除 uuid 部分,当我需要整行消失和空白时。

我已经测试了我的正则表达式herehere,我相信它可以正常工作。

谁能指点我一些关于 macOS 和正则表达式的文档的方向?

【问题讨论】:

  • 在第一个示例中,您的sed 命令不完整。它缺少一个斜线。
  • 还有,我相信\n可以去掉
  • 正如 GolfWolf 所指出的,这并不是一个真正的正则表达式问题,而是一个sed 问题。 Whith 正则表达式可以很好地使用您当前使用的确切工具进行测试。
  • tripleee 的答案有效,我接受为正确答案。

标签: regex macos replace find xargs


【解决方案1】:

seds 命令需要两个参数。您可以使用与整行匹配的正则表达式将整行替换为空行(注意末尾的 .* 正则表达式通配符);

s/^uuid:.*//

或使用d 命令删除任何匹配的行;

/^uuid:/d

前者会留下最后的换行符(尽管某些sed 方言也可以让您匹配和替换它),而删除一行总是会删除其尾随的换行符。

尽管表面上相似,但它们在语法上是不同的。 s 命令无条件应用于每一行(尽管如果正则表达式不匹配,它不会替换任何内容),而 d 命令有一个 address expression,它只选择某些行(同样,使用正则表达式,但不必匹配整行)。

【讨论】:

  • sed 手册解释了该语言的语法,虽然它当然不是一个好的介绍性文本。任何对sed 的介绍都会更详细地解释这些概念;尽管我记得很多年前喜欢 O'Reilly sed & awk 的书(即使当时我已经对这两本书都有些熟悉),但我不愿推荐任何特定的书。
  • 是的。就是这样。根据我交谈过的几个人的说法,他们的印象是 s/ 是终端中正则表达式的分隔符。
  • 如果这确实是您的计划,请单击复选标记,使其变为绿色。如果您改变主意,您可以撤消。谢谢!另请参阅help
猜你喜欢
  • 1970-01-01
  • 2020-04-22
  • 2011-12-14
  • 2011-12-31
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多