我有这些:
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: 2334
server: serverA
run_as:
sub_ap: FRUIT
或者像这样:
call_type:
,,,,,,,,(I
空alert_id:
值),,,…2334
server:
serverA
run_as:
sub_ap:
FRUIT
和或许您不知道如何迭代位置参数,因此您习惯echo $*
获取一个您知道如何处理的字符串sed
。
不要使用不带引号的$*
。考虑不要使用echo
。 如果你真的需要连接位置参数,然后使用printf '%s\n' "$*"
,而不是echo $*
。sed
然后您的命令应该可以工作。在这种特殊情况下,甚至echo "$*"
会有所帮助。
但如果我是对的,并且您要处理的内容来自多个位置参数,这些参数可以以合理的方式传递空值,那么您应该集中精力逐个(或逐对)解析参数,而不是构建涉及的任何东西$*
。