如果我有字符串:
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/