如何使用 sed 获取冒号后的值

如何使用 sed 获取冒号后的值

我有这些:

variable="call_type: I alert_id: 2334 server: serverA run_as: sub_ap: FRUIT...."   

我只需要一条命令即可获取变量的值。我尝试使用以下命令:

callType=$(echo $variable | sed 's/call_type: \(.*\) alert_id.*/\1/')

没关系,它给了我价值

但如果某些字段没有值,例如运行方式:

runAs=$(echo $* | sed 's/.* run_as: \(.*\) sub_ap.*/\1/')

它给了我所有的线路。

我该怎么做呢?我只需要一行可以在所有情况下使用的语句。谢谢,抱歉我的英语不好!

答案1

您的代码假设紧接着和sed之后有一个空格run_as:其他之前的空格sub_ap:。要获取的值位于两个空格之间。

run_as:但在你的数据中,和之间只有一个空格sub_ap:

call_type: I alert_id: 2334 server: serverA run_as: sub_ap: FRUIT....

即使有两个空格,在许多 shell 中echo $variable也会将它们变成一个空格,因为缺乏引用echo当它收到多个参数时会做什么:

实用echo程序参数应通过单身的最后一个参数后面应跟有 <space> 字符和 <newline> 字符。

来源;重点是我的)

您的麻烦sed 's…'没有匹配任何内容,也没有替换任何内容,因此您得到了整条线。

最简单的修复方法是让两个空格中的一个不存在:

sed 's/.* run_as: \?\(.*\) sub_ap.*/\1/'

在我看来,在一行中传递键和值的格式有些奇怪;在空字符串后删除分隔符的格式相当愚蠢。


也许愚蠢的格式是你临时创建的,而原始输入并没有那么愚蠢。也许原始输入是一个字符串,在run_as:和之间包含两个空格sub_ap:,而你的问题是由于echo $variable。或者也许原始输入根本不愚蠢也不奇怪。的用法$*让我怀疑您正在尝试处理位置参数可能相当理智。像这样:

call_type: I,,,,,,…alert_id: 2334server: serverArun_as:sub_ap: FRUIT

或者像这样:

call_type:,,,,,,,,(Ialert_id:值),,,…​​​2334server:serverArun_as:sub_ap:FRUIT

或许您不知道如何迭代位置参数,因此您习惯echo $*获取一个您知道如何处理的字符串sed

不要使用不带引号的$*考虑不要使用echo。 如果你真的需要连接位置参数,然后使用printf '%s\n' "$*",而不是echo $*sed然后您的命令应该可以工作。在这种特殊情况下,甚至echo "$*"会有所帮助。

但如果我是对的,并且您要处理的内容来自多个位置参数,这些参数可以以合理的方式传递空值,那么您应该集中精力逐个(或逐对)解析参数,而不是构建涉及的任何东西$*

相关内容