Сценарии KSH: как разделить на ',', когда значения выходят через запятую? - PullRequest
1 голос
/ 05 октября 2008

Я пытаюсь написать скрипт KSH для обработки файла, состоящего из пар имя-значение, по несколько в каждой строке.

Формат:

NAME1 VALUE1,NAME2 VALUE2,NAME3 VALUE3, etc

Предположим, я пишу:

read l
IFS=","
set -A nvls $l
echo "$nvls[2]"

Это даст мне вторую пару имя-значение, красивую и простую. Теперь предположим, что задача расширена, чтобы значения могли включать запятые. Они должны быть спасены, как это:

NAME1 VALUE1,NAME2 VALUE2_1\,VALUE2_2,NAME3 VALUE3, etc

Очевидно, что мой код больше не работает, так как «read» удаляет все кавычки, а второй элемент массива будет просто «NAME2 VALUE2_1».

Я застрял с более старым ksh, у которого нет "read -A array". Я пробовал разные трюки с «read -r» и «eval set -A ....», но безрезультатно. Я не могу использовать «read nvl1 nvl2 nvl3», чтобы делать эскапирование и разбиение внутри чтения, так как я не знаю заранее, сколько пар имя-значение есть в каждой строке.

У кого-нибудь есть полезная хитрость для меня?

PS Я знаю, что делаю это в самый раз в Perl, Python, даже в awk. Тем не менее, я должен сделать это в ksh (... или умереть, пытаясь;)

Ответы [ 2 ]

1 голос
/ 05 октября 2008

Как это часто бывает, я придумал ответ через несколько минут после того, как задал вопрос на публичном форуме: (

Я обошел проблему цитирования / снятия цитаты, пропустив входной файл через следующий скрипт sed:

sed -e 's/\([^\]\),/\1\
/g;s/$/\
/

Он преобразовал входные данные в:

NAME1.1 VALUE1.1
NAME1.2 VALUE1.2_1\,VALUE1.2_2
NAME1.3 VALUE1.3
<empty line>
NAME2.1 VALUE2.1
<second record continues>

Теперь я могу проанализировать этот ввод следующим образом:

while read name value ; do
  echo "$name => $value"
done

Значение будет иметь свои запятые без кавычек "read", и я могу добавить "name" и "value" в некоторый ассоциативный массив, если мне нравится.

PS Поскольку я не могу принять свой собственный ответ, я должен удалить вопрос или ...?

0 голосов
/ 30 октября 2008

Вы также можете изменить шаблон \, на что-то еще, что, как известно, не появляется ни в одной из ваших строк, а затем изменить его обратно после того, как вы разбили входные данные в массив. Для этого вы можете использовать встроенный синтаксис подстановки шаблонов ksh, вам не нужно использовать sed, awk или что-то еще.

read l
l=${l//\\,/!!}
IFS=","
set -A nvls $l
unset IFS
echo ${nvls[2]/!!/,}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...