Как зациклить значения через запятую в сценарии оболочки - PullRequest
0 голосов
/ 13 февраля 2019

Я пытался зациклить значения, разделенные запятыми, пробелом, но не смог получить точное значение, поскольку в строке есть пробел.

Я пытался по-разному, но не смог получить желаемых результатов.Может ли кто-нибудь помочь мне в этом

#!/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

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Вы должны использовать одинарные кавычки для разбиения строки (и кавычки "$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 "'"
0 голосов
/ 14 февраля 2019

Это то же самое, что и ответ Чепнера , только kludgier, ( подстановка переменных ) и более опасно, (eval ...)чем лучше использовать точное задание ОП $values:

values="('A','sample text','Mark')"
eval values=${values//,/ }
for i in "${values[@]}"; do
  echo "$i"
done

Это работает в ksh, но на самом деле, если это вообще возможно, попробуйте использовать Чепнера проще и безопаснее $values назначение.

0 голосов
/ 14 февраля 2019

Просто обрезать кавычки

#!/bin/ksh

values="('A','sample text','Mark')"
echo $values |  tr  -d "()'\"" | tr ',' '\n'

вывод:

A
sample text
Mark
0 голосов
/ 13 февраля 2019

Сначала измените values на массив.Тогда итерируя это просто.

values=(A "sample text" Mark)
for i in "${values[@]}"; do
  echo "$i"
done
...