【问题标题】:Extract string between combination of words and characters [duplicate]在单词和字符组合之间提取字符串[重复]
【发布时间】:2022-05-08 04:44:49
【问题描述】:

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

输入:

FROM some_registry as registry1
FROM another_registry

输出:

some_registry
another_registry

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

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

【问题讨论】:

  • sed 's/.*From \(.*\) as.*/\1/;s/From //' file?见ideone.com/cjvvaB。在这里合并成一个正则表达式很困难,因为 POSIX 正则表达式不支持惰性量词。
  • 这是因为您的正则表达式与您在问题中发布的字符串不匹配(请参阅FromFROM"FROM ")。
  • 好吧,也许grep -oP 'FROM\s+\K.*?(?=\s+as\b|$)' file 是更好的选择?当然,如果你有 GNU grep
  • 从重复链接中,查看答案stackoverflow.com/a/25386918/5866580,当我根据显示的示例运行它时,例如:grep -oP 'FROM\s*\K(?:(?!\s+as).)*' file 它给了我所需的输出。

标签: regex bash sed


【解决方案1】:

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

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

sed 's/.*FROM \(.*\) as.*/\1/;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) - 不区分大小写匹配开启
  • \b - 单词边界
  • FROM - 一句话
  • \s+ - 一个或多个空格
  • \K - “忘记”到目前为止匹配的所有文本
  • .*? - 除换行符之外的任何零个或多个字符尽可能少
  • (?=\s+as\b|$) - 正向前瞻匹配紧跟一个或多个空格,然后是整个单词 as 或字符串结尾的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2021-11-05
    相关资源
    最近更新 更多