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

У меня есть строка Содержит ключ = формат значения, разделенный # Я пытаюсь заменить '=' вхождения символов на ':' в значении TITLE, используя скрипт BASH.

"ID=21566#OS=Linux#TARGET_END=Synchronica#DEPENDENCY=Independent#AUTOMATION_OS=Linux#AUTOMATION_TOOL=JSystem#TITLE=Session tracking. "DL Started" Status Reported.Level=none"   

позже я анализирую эту строку для выполнения операции eval

eval $(echo $test_line | sed 's/"//g' | tr '#' '\n' | tr ' ' '_' | sed 's/=/="/g' | sed 's/$/"/g')

Когда секция sed 's/=/="/g' также изменит ..Level=none на Level="none Это приводит к

eval: line 52: unexpected EOF while looking for matching `"'

Что будет правильным заменить команду bash вместо моей строки?

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

В качестве альтернативы рассмотрите решение pure-bash, чтобы перевести переменные в bash, избегая (рискованного) eval.

IFS=# read -a kv <<<"ID=21566#OS=Linux#TARGET_END=Synchronica#..."

for kvp in "${kv[@]}" ; do
    declare "$kvp"
done
0 голосов
/ 03 ноября 2019

Я сделал это так:

echo '"ID=21566#OS:Linux#TARGET_END:Synchronica#DEPENDENCY:Independent#AUTOMATION_OS:Linux#AUTOMATION_TOOL:JSystem#TITLE:Session tracking. "DL Started" Status Reported.Level=none"' \
 | 
sed -E 's/(#)?([A-Z_]+)(=)/\1\2:/g'

Дайте мне знать, если это работает для вас.

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

Я нашел способ ее решить.
Я добавлю sed 's / = /: / 8g' в мою команду eval. Он заменит восьмой-ный вхождения '='.
Действие повлияет только на значение TITLE, как и ожидалось.

 eval $(echo $test_line | sed 's/=/:/8g' | sed 's/"/"/g' | tr '#' '\n' | tr ' ' '_' | sed 's/=/="/g' | sed 's/$/"/g')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...