我试图用空格循环逗号分隔的值,但是由于字符串中有空格,所以无法获得确切的值。
我尝试了不同的方法,但无法获得预期的结果。 有人可以帮我吗
#!/bin/ksh
values="('A','sample text','Mark')"
for i in `echo $values | sed 's/[)(]//g' | sed 's/,/ /g'`
do
echo $i
done
我的预期输出是:
A
sample text
Mark
答案 0 :(得分:2)
首先,将values
更改为数组。然后遍历它很简单。
values=(A "sample text" Mark)
for i in "${values[@]}"; do
echo "$i"
done
答案 1 :(得分:1)
只需修剪引号
#!/bin/ksh
values="('A','sample text','Mark')"
echo $values | tr -d "()'\"" | tr ',' '\n'
输出:
A
sample text
Mark
答案 2 :(得分:0)
这与Chepner's answer相同,只是kludgier(variable substitution),更危险的(eval
...),使用OP精确的{{ 1}}作业:
$values
它可以在values="('A','sample text','Mark')"
eval values=${values//,/ }
for i in "${values[@]}"; do
echo "$i"
done
中工作,但是实际上,如果有可能,请尝试使用 Chepner的更简单,更安全的ksh
分配。
答案 3 :(得分:0)
您应使用单引号将字符串分割(并用引号"$values"
)。
当您的sed
支持\n
替换为一行时,您可以不使用循环:
echo "${values}" | sed "s/[)(]//g;s/','/\n/g;s/'//g"
# or
sed "s/[)(]//g;s/','/\n/g;s/'//g" <<< "${values}"
当字符串中的值不带逗号和括号时,可以使用
grep -Eo "[^',()]*" <<< "${values}"
更好的是在2个单引号之间寻找字段,并删除这些单引号。
grep -Eo "'[^']*'" <<< "${values}" | tr -d "'"