【问题标题】:Unix: Cut string by regex delimiterUnix:通过正则表达式分隔符剪切字符串
【发布时间】:2016-07-08 14:39:51
【问题描述】:

我有打印出目录树中最长路径的功能。假设该函数打印以下内容:./.mozilla/firefox/z6upkljn.default/storage/permanent/chrome/idb/2918063365piupsah.files

我想要做的是在与用户定义的正则表达式匹配后剪切这个字符串。

例如,如果用户输入正则表达式:*de?a*,则唯一匹配是 z6upkljn.default。所以最后,输出将是./.mozilla/firefox

这是我找到的代码示例sed 's/My_expression.*//' 其中 My_expression 是正则表达式分隔符,用于用户定义的切割。

它适用于这个输入$echo /homes/eva/xm/xmikfi00 | sed 's/mik.*//',对于输出我得到/homes/eva/xm/x。正如预期的那样。

但如果我输入简单的正则表达式$echo /homes/eva/xm/xmifki00 | sed 's/mi?.*//',则输出为/homes/eva/xm/xmikfi00。谁能帮助我如何获得与上一个示例相同的输出?

如果有任何帮助或建议,我将很高兴,谢谢。

【问题讨论】:

  • 这里的分隔规则是什么?
  • 分隔符由用户定义,可以扩展正则表达式。
  • regex like: *de?a*,唯一匹配的是 z6upkljn.default。这里有什么规则?
  • 任何匹配正则表达式*de?a*
  • *de?a* 不是正则表达式,它是一个 glob 表达式,您不能将其与 sed 一起使用。

标签: regex string bash sed cut


【解决方案1】:

Sed 使用(默认情况下)POSIX BRE,而不是 ERE。如果您要与? 匹配的是“任何字符”,请使用.echo /homes/eva/xm/xmifki00 | sed 's/mi..*//'

有关详细信息,请参阅man 7 re_format

【讨论】:

  • 那么是否有任何可能的解决方案如何使其对 ERE 友好?
  • 是的。使用调用该语言的“glob”库的 sh、bash、perl、python 等编写您自己的代码。或者将 glob 翻译成正则表达式——这并不难。或许您应该 man bash 了解 globbing 的工作原理。
  • 是的,虽然它不是标准的。基于 BSD 的 seds 有一个 -E 选项,而 GNU sed 使用 -r。然而,这些都不能使? 匹配任何字符;这不是任何一种 POSIX 正则表达式语法的特性。
  • 而且如上所述,您的示例确实是一个 glob,而不是我熟悉的任何方言的正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多