用 sed 替换无法按预期进行变量扩展,出现额外字符

用 sed 替换无法按预期进行变量扩展,出现额外字符

我遇到了一些麻烦sed

我需要用某些东西替换文件中的字符串,并且我已经部分成功,但是我t在实际输出前面得到了一个额外的字符串。

这些是我正在使用的命令

password=$(openssl rand -base64 8)
new_variable=$(echo -n "$password{s4lt}"  | sha256sum | awk '{print $1}')
to_be='#jbcrypt:$2a$10$mvkjME9eLxgvNu1f35SsSe5JKuVZaDf7xZX8DufaUMsMtDMzrGPUa'
with_be="<passwordHash>s4lt:${new_variable}</passwordHash>"

刺痛要更换

<passwordHash>#jbcrypt:$2a$10$mvkjME9eLxgvNuMsMtDMzrGPUa</passwordHash>

<passwordHash>s4lt:c3b43792278faa66ffad524c6433bb755057455a0d43b4af4cab927dafc84f8a</passwordHash>

使用命令

sed -i "/$to_be/c \t\t$with_be" /var/lib/jenkins/users/admin/config.xml

结果

t   <passwordHash>s4lt:c3b43792278faa66ffad524c6433bb755057455a0d43b4af4cab927dafc84f8a</passwordHash>

答案1

由于您的模式包含/,因此您必须告诉sed在范围表达式中使用另一个分隔符/$to_be/。在这里,我使用@作为分隔符:

sed -i "\@$to_be@c\ \t\t$with_be" /var/lib/jenkins/users/admin/config.xml

另请注意命令后面的反斜杠c

如果如上面所示进行转义,则可以在范围表达式中使用备用分隔符。除了\换行符之外,几乎可以使用任何字符。您应该选择 的值中未出现的一项$to_be

(“更改”)命令c的形式为

range c\
text

GNUsed是宽容的,因为它允许替换文本与命令本身出现在同一行,即它允许range c\ text.

相关内容