我有一根绳子
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 脚本新手,无法解决这个问题。
尝试在最终回声之前添加
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[@]// /,}"
来完成的,它表示从数组中提取每个元素,用逗号替换找到的所有空格。 双引号对于防止通道值作为单独的参数出现是必要的。