Регулярное выражение для сопоставления и разделения каждого третьего вхождения строки - PullRequest
0 голосов
/ 05 ноября 2019

в скрипте Korn Shell У меня есть большой объем данных в строковой переменной contents, которая соответствует следующему синтаксису:

account_id_0:group_id_0:name_0
account_id_1:group_id_1:name_1
              ...
account_id_N:group_id_N:name_N

Я хочу разбить строку на символ : каждыйтретий экземпляр, чтобы я мог сгенерировать три другие строки accounts, groups и names, имеющие формат:

accounts = account_id_0,account_id_1,...,account_id_N
groups = group_id_0,group_id_1,...,group_id_N
names = name_0,name_1,...,name_N

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

Могу ли я добиться этого, используя что-то вроде sed, cut или awk команды?

текущее регулярное выражение, которое я использую для сбора учетных записей:

[a-zA-Z][0-9]+(?:([a-zA-z]*[0-9]*)*)(?:([a-zA-Z]*[0-9]*)*)

Но я чувствую, что есть более эффективная альтернатива.

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

1 Ответ

0 голосов
/ 05 ноября 2019

Я бы использовал массивы и обрабатывал переменную содержимого как чтение строк из файла:

contents='account_id_0:group_id_0:name_0
account_id_1:group_id_1:name_1
...:...:...
account_id_N:group_id_N:name_N'

as=()
gs=()
ns=()
while IFS=: read -r a g n; do
    as+=("$a")
    gs+=("$g")
    ns+=("$n")
done <<< "$contents"

accounts=$(IFS=,; echo "${as[*]}")
groups=$(IFS=,; echo "${gs[*]}")
names=$(IFS=,; echo "${ns[*]}")

printf "%s\n" "$accounts" "$groups" "$names"
account_id_0,account_id_1,...,account_id_N
group_id_0,group_id_1,...,group_id_N
name_0,name_1,...,name_N

Если вы получаете значение contents из файла, вы можете пропуститьшаг сохранения его в переменной и просто чтение файла напрямую.

...