안녕하세요. 누구든지 도와주실 수 있나요? 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'