提取单词和字符组合之间的字符串

Extract string between combination of words and characters

我想保留(FROM 和 as)和(From 和换行符)之间的字符串。

输入:

FROM some_registry as registry1
FROM another_registry

输出:

some_registry
another_registry

使用以下 sed 命令,我可以提取字符串。有没有办法结合这两个 sed 命令?

sed -e 's/.*FROM \(.*\) as.*//' | sed s/"FROM "//

这里很难合并到一个正则表达式中,因为 POSIX 正则表达式不支持惰性量词。

使用 GNU sed,您可以将命令传递为

sed 's/.*FROM \(.*\) as.*//;s/FROM //' file

参见 this online demo

但是,如果你有 GNU grep,你可以使用更精确的表达方式:

#!/bin/bash
s='FROM some_registry as registry1
From another_registry'
grep -oP '(?i)\bFROM\s+\K.*?(?=\s+as\b|$)' <<< "$s"

online demo详情:

  • (?i) - 匹配不区分大小写 ON
  • \b - 单词边界
  • FROM - 一句话
  • \s+ - 一个或多个空格
  • \K - “忘记”目前匹配的所有文本
  • .*? - 除换行字符外的任何零个或多个字符尽可能少
  • (?=\s+as\b|$) - 匹配一个位置的正先行,紧跟一个或多个空格,然后是整个单词 as,或字符串结尾。