如何替换给定子字符串后字符串中特定的char出现

问题描述 投票:0回答:3

我有一个字符串,包含以#分隔的key = value格式我正在尝试使用BASH脚本将TITLE值中的'='字符出现替换为':'。

"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命令来替换我的字符串?

linux bash shell replace
3个回答
0
投票

我找到了解决方法。我将sed's / = /:/ 8g'添加到我的eval命令中。它将替换第8至第n个出现的'='。该操作只会影响预期的TITLE值。

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

0
投票

作为替代方案,考虑使用纯bash解决方案将变量引入bash,避免(风险)评估。

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

for kvp in "${kv[@]}" ; do
    declare "$kvp"
done

0
投票

我是这样的:

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'

让我知道它是否对您有用。

© www.soinside.com 2019 - 2024. All rights reserved.