我遇到了一些麻烦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
.