xml 파일의 값을 변수에 ""가 누락된 sed 값으로 바꿉니다.

xml 파일의 값을 변수에 ""가 누락된 sed 값으로 바꿉니다.

안녕하세요. 누구든지 도와주실 수 있나요? Tomcat server.xml 파일의 값을 바꾸려고 합니다.사용자 이름sed 명령 사용

<Resource username="user1" password="xxxxxxxx"/>

아래 명령은 예상대로 값을 바꾸지만 변수 U에서 값을 가져오기 때문에 값 주위에 ""가 없습니다.

export U="userx"
sed -i -E  's/(username=)([a-zA-Z0-9"-])+/\1'"$U"'/g' server.xml

userx 주변에 "" 출력이 누락되었습니다. <Resource username=userx password="xxxxxxxx"/>

변수 대신 값을 사용하면 ""에서도 작동합니다.

sed -i -E  's/(username=)([a-zA-Z0-9"-])+/\1"userx"/g' server.xml

ouput: <Resource username="userx" password="xxxxxxxx"/>

답변1

XML을 편집하면 sed실패하기 쉽습니다 . 대신 XML 편집 도구를 사용하세요. xmlstarlet예 를 들어,

U='userx'
xmlstarlet edit --inplace --update '//Resource/@username' --value "$U" server.xml

--inplace개인적으로 저는 대안이 작동하는지 테스트하기 전까지는 대안을 사용하지 않을 것입니다.

xmlstarlet이는 일반적으로 배포판의 패키지 관리자에서 사용할 수 있습니다. 가지고 있지 않고 설치할 권한이 없는 경우에는 변경 게시판에 설치 요청을 제출하세요. 올바른 작업에 적합한 도구를 사용하는 것입니다.


sed그런데, 명령이 작동하지 않는 이유는 포함하려는 큰따옴표를 볼 수 없기 때문입니다. 다음은 몇 가지 설명이 포함된 원래 명령입니다.

sed -E 's/(username=)([a-zA-Z0-9"-])+/\1'"$U"'/g'
       ^single quotes start             ^single quotes end
                                         ^double quotes start
                                            ^double quotes end

쉘은 따옴표를 사용하여 문자열이 어떻게 구문 분석되는지(또는 구문 분석되지 않는지) 식별합니다. 작은따옴표는 문자 그대로의 문자 시퀀스를 제공합니다. 큰따옴표는 대부분의 문자를 보호하지만 특히 변수 평가를 허용합니다.명령( sed이 경우)에서는 외부 따옴표가 표시되지 않습니다.따라서 문자열에 큰따옴표를 포함하려면 큰따옴표를 인용해야 합니다.

가독성을 위해하지만 문법적 정확성은 높지 않습니다.수정된 단일 표현식을 따옴표로 나누었습니다.

sed -E 's/(username=")([a-zA-Z0-9-])+/\1' "$U" '"/g'
       ^literal text used as an RE
                                          ^variable (quoted to protect it from the shell)
                                               ^more literal text

sed단일 표현식 문자열을 볼 수 있도록 다시 합치면 ,

sed -E 's/(username=")([a-zA-Z0-9-])+/\1'"$U"'"/g'

관련 정보