如何为 sed 创建一个简单的正则表达式?

Posted

技术标签:

【中文标题】如何为 sed 创建一个简单的正则表达式?【英文标题】:How can I create a simple regexp for sed? 【发布时间】:2021-09-12 03:22:51 【问题描述】:

这是我得到的文本文件 #1:

abc:
  xyz: Hi ***!
  x-cool-value: v5

还有一个:

abc:
  xyz: Hi ***!
  x-cool-value: foobar/v7

所以对于第一个文件我想提取v5 和#2:v7x-cool-value 始终是常量/存在于输入文本文件中。

我想出了:

$ sed -n 's/^ *x-cool-value: *//p' foo.yaml
# return either `v2` or `foobar/v7`

但不确定如何使其适用于两个测试文件。

【问题讨论】:

如果这是 YAML,请使用 YAML 解析器。 【参考方案1】:

好吧,那肯定行不通。通过添加: *,您只是在说“冒号后跟零个或多个空格”。如果您想要的是空格后的整行,那效果很好。但是如果你想跳过的不仅仅是空格,你必须让你的正则表达式匹配你想跳过的东西。

看起来,尽管您实际上并没有定义它,但您希望跳过所有空格PLUS 直到并包括最后一个 / 的所有字符(如果存在)。另一种解释你想要的方式是,所有字符直到并包括 first / 但既然你没有说我选择实现前者。

可以这样做:

sed -n 's,^ *x-cool-value: *\(.*/\)*,,p' foo.yaml

我在这里将正则表达式分隔符从/ 更改为,,但你可以选择任何你喜欢的:我不想使用/,因为它出现在正则表达式中。

额外的位\(.*/\)* 表示匹配一组以/ 结尾的字符,零次或多次。

建议您去寻找一本书或一个网站,该书或网站可以为您提供一些关于正则表达式的说明。对于想要在 Linux 和 MacOS 等 POSIX 系统中执行任何类型的非平凡脚本的任何人来说,它们都非常有用且绝对需要。

【讨论】:

以上是关于如何为 sed 创建一个简单的正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

OS X sed -E 不接受扩展的正则表达式

sed 正则表达式

sed 正则表达式

如何为输入值编写正则表达式? [关闭]

jQuery validate:如何为正则表达式验证添加规则?

如何为提及和主题标签修复此正则表达式?