Вам не нужно использовать массив. Поскольку входные данные кажутся очень регулярными, я бы преобразовал входные данные в операторы присваивания оболочки, затем прочитал их в оболочке и оценил. Примерно так:
#!/bin/sh
sed '
s/^[-0-9]* */date=/
s/,.*thisOne={/ /
s/}.*//
s/,/ /g
' "$@" |
while read line
do
eval $line
echo date=$date
echo id=$id
echo name=$name
echo ip=$ip
echo port=$port
done
Команда sed
преобразует строку ввода в следующую:
date=00:12:10 id=1001 name=TestGw ip=192.168.0.1 port=88
Цикл while
читает по одной такой строке за раз, а eval $ line
] вызывает выполнение строки в оболочке, в результате чего переменные устанавливаются на заданные значения.
Сценарий будет обрабатывать имена файлов из командной строки ИЛИ стандартного ввода (обратите внимание на «$ @»
в конце команды sed
).
Команда sed
преобразует строку в операторы присваивания оболочки с помощью серии команд s
(заменить):
Заменить, только в начале строки ( ^
), любая последовательность тире и цифр ( [- 0-9] *
), за которой следует один или несколько пробелов ( *
) с date =
:
s / ^ [- 0-9] * * / date = /
Замените запятую, за которой следует любые символы (. *
), за которыми следует thisOne =
с пробелом:
s /,.* thisOne = {/ /
Удалить закрывающую скобку (}
), за которой следует любые другие символы. (. *
) до (подразумеваемого) конца строки:
s /}. * //
Заменить все запятые (,
) с пробелами:
s /, / / g
В примере сценария я рекомендую временно удалить канал |
до конца файла и запустить только sed
командная часть скрипта, чтобы вы могли поэкспериментировать и увидеть, как w это работает.
tr
заменяет отдельные символы, а не строки. Как вы предполагаете, вы можете использовать sed
для удаления строки в конце строки:
git branch --merged dev | sed 's/@squashed$//'
Вместо зацикливания используйте grep
, чтобы определить, содержит ли список строк, по одной на строку, строку, начинающуюся со ссылочной строки:
git branch --merged dev | sed 's/@squashed$//' | grep -q "^..$current_branch"
А еще лучше, поскольку вы используете git
, попросите его отфильтровать для вас:
git branch --list "${current_branch}*" --merged dev
перечислит любую ветку, объединенную с dev
, имя которой начинается с текущей ветки. (Поскольку вы выполняете фильтрацию по началу имен веток, вам не нужно удалять часть «@squashed», если только я что-то не упустил.)