用逗号分割和替换在 shell 脚本中不起作用

问题描述 投票:0回答:1

我有一根绳子

z="job_name=market_scenario,channel=GOOGLE FACEBOOK INSTAGRAM,time_limit=60sec"

现在我想要以下格式的数据

job_name=market_scenario
channel=GOOGLE,FACEBOOK,INSTAGRAM
time_limit=60sec

我正在做以下处理

z="job_name=market_scenario,channel=GOOGLE FACEBOOK INSTAGRAM,time_limit=60sec"
IFS=","
read -ra arr <<< "$z"
env=''
job_name=''
channel=''
time_limit=''
for val in "${arr[@]}";
do
    split_value=$(echo $val | awk '{split($0,a,"="); print a[2]}')
    if [[  $val =~ "job_name=" ]];
        then
            job_name=$split_value
    elif [[ $val =~ "time_limit=" ]];
        then
            time_limit=$split_value
    elif [[ $val =~ "channel=" ]];
        then
           temp_data=$split_value
           channel=$(echo "$temp_data" | awk '{ gsub (" ", ",", $0); print}')
    fi
done

echo $job_name
echo $time_limit
echo $channel

IO 正在获取通道的输出是

GOOGLE FACEBOOK INSTAGRAM

空格没有被逗号替换。 我是 shell 脚本新手,无法解决这个问题。

bash shell awk split gsub
1个回答
0
投票

尝试在最终回声之前添加

unset IFS
,看看会得到什么。

你明白现在发生了什么吗? 变量已正确分配,但当您在末尾显示它时,由于 IFS,逗号被空格替换。

我想你可能会对我的版本感到好笑:

 z="job_name=market_scenario,channel=GOOGLE FACEBOOK INSTAGRAM,time_limit=60sec"
 IFS=","
 read -ra arr <<< "$z"
 for val in "${arr[@]// /,/}";
 do
     eval "$val"
 done
 IFS=
 echo $job_name
 echo $time_limit
 echo $channel

变量名位于 z 变量中,除了通道中的空格之外,字符串的每一部分看起来都像有效的 bash 赋值。在这种情况下,bash 很乐意为您进行解析。

我们可以通过在 bash 中进行替换而不是调用 awk、sed 或 tr 来节省一些时间。 这是通过(诚然非常可怕)

"${arr[@]// /,}"
来完成的,它表示从数组中提取每个元素,用逗号替换找到的所有空格。 双引号对于防止通道值作为单独的参数出现是必要的。

© www.soinside.com 2019 - 2024. All rights reserved.