正则表达式:无论顺序如何查找元素

标签 regex sed

如果我有字符串:

geo:FR, host:www.example.com

(实际上字符串更复杂并且有更多字段。)

我想提取“geo”值和“host”值,当键的顺序发生变化时我遇到问题,如下所示:

host:www.example.com, geo:FR

我尝试了这一行:

sed 's/.\*geo:\([^ ]*\).\*host:\([^ ]*\).*/\1,\2/'

但它只适用于第一个字符串。 有没有办法在单个正则表达式中做到这一点,如果没有,最好的方法是什么?

最佳答案

我建议使用单独的 sed 命令提取您需要的每个文本:

s="geo:FR, host:www.example.com"
host="$(sed -n 's/.*host:\([^[:space:],]*\).*/\1/p'  <<< "$s")"
geo="$(sed -n 's/.*geo:\([^[:space:],]*\).*/\1/p'  <<< "$s")"

请参阅online demo , echo "$host and $geo" 打印

www.example.com and FR

对于两个输入。

详细信息

  • -n 抑制行输出,p 打印匹配
  • .* - 匹配最后一个以上的任意 0 个字符...
  • host: - host: 子字符串,然后
  • \([^[:space:],]*\) - 将除空格和逗号之外的任何 0 个或多个字符捕获到组 1
  • .* - 该行的其余部分。

结果只是第 1 组的内容(请参阅替换模式中的 \1)。

关于正则表达式:无论顺序如何查找元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56834183/

相关文章:

css - 正则表达式,只获取第一次出现并停止

用于查找单词和引号的正则表达式

regex - R 中的 LEFT 加 FIND 函数相当于什么?

linux - 如何使用 substr 比较替换字段

linux - sed -i 帮助(bash)

regex - 如何使用SED从文件中删除CTRL-A字符?

awk 打印文件中每一行和下一行的字段

c# - 正则表达式 - 如何匹配多个正确引用的子字符串

javascript - 如何在 split() javascript 中排除转义字符

regex - 使用 sed 命令替换一行中的字符串