문제가 좀 있습니다 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
GNU는 대체 텍스트가 명령 자체와 같은 줄에 나타날 수 있도록 허용한다는 점에서 허용적입니다 . sed
즉, .range c\ text