Могу ли я использовать обратную ссылку в качестве ключа ассоциативного массива? - PullRequest
0 голосов
/ 10 октября 2019

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

sed -n -e "s/\(user=\)\([a-zA-Z0-9]*\)\s(.*\)/\1\2 \3 more_info=${user_info[\2]}/p" "./log.txt" > "./log_plus.txt"

Но когда я делаю это, more_info= становится пустым. Я делаю что-то не так или это невозможно?

1 Ответ

1 голос
/ 11 октября 2019

В качестве обходного пути с bash регулярным выражением (без sed), попробуйте что-то вроде:

declare -A user_info["username123"]="age:23"    # just an example of user_info
pattern="(user=)([a-zA-Z0-9]*) (.*)"
while IFS= read -r line; do
    if [[ $line =~ $pattern ]]; then
        printf "%s%s %s more_info=%s\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" "${user_info["${BASH_REMATCH[2]}"]}"
    fi
done < "./log.txt" > "./log_plus.txt"

Пример log.txt:

user=username123 blah blah
other lines

Ивывод:

user=username123 blah blah more_info=age:23

Просто для информации вы можете упростить строку printf следующим образом:

printf "%s%s %s more_info=%s\n" "${BASH_REMATCH[@]:1:3}" "${user_info["${BASH_REMATCH[2]}"]}"

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...