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

GNU는 대체 텍스트가 명령 자체와 같은 줄에 나타날 수 있도록 허용한다는 점에서 허용적입니다 . sed즉, .range c\ text

관련 정보