提取单词和字符组合之间的字符串
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
,或字符串结尾。
我想保留(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
,或字符串结尾。