XML 속성 값을 셸 변수 값으로 바꿉니다.

XML 속성 값을 셸 변수 값으로 바꿉니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">
<POWERMART CREATION_DATE="12/01/2016 17:43:15" REPOSITORY_VERSION="184.93">
<REPOSITORY NAME="PCREPO_BIDEV" VERSION="184" CODEPAGE="UTF-8" 
DATABASETYPE="Oracle">
<FOLDER NAME="ABC" GROUP="" OWNER="Administrator" SHARED="SHARED" 
DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="3b13d2c9-39dc-426f-8320- 
def2bb8424ef">

위의 샘플 데이터가 있습니다. 어떤 파일에 특정 값을 가진 폴더 이름이 있을 것입니다. 다른 값으로 바꿔야 합니다. 변수이므로 FOLDER NAME="ABC"를 DEF로 바꾸고 싶습니다.

 sed -i "s/<FOLDER NAME=\"\*\"/<FOLDER NAME=\"$FLDR\"/g" Gather.XML

위의 sed 명령은 오류를 발생시키지 않지만 대체하지는 않습니다.

답변1

이것이 올바른 형식의 XML 문서라고 가정하면 다음을 사용하십시오.XML 스타:

xmlstarlet ed -u '/POWERMART/REPOSITORY/FOLDER[@NAME="ABC"]/@NAME' -v "$FLDR" file.xml

그러면 속성이 있는 노드를 찾고 FOLDER해당 값을 쉘 변수의 값으로 변경합니다./POWERMART/REPOSITORYNAMEABCFLDR

FOLDER이는 노드 이름과 속성 사이에 개행 문자가 있는 경우에도 NAME작동합니다 . XML은 이러한 공백에 민감하지 않기 때문입니다.

예:

$ cat file.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">
<POWERMART CREATION_DATE="12/01/2016 17:43:15" REPOSITORY_VERSION="184.93">
  <REPOSITORY NAME="PCREPO_BIDEV" VERSION="184" CODEPAGE="UTF-8" DATABASETYPE="Oracle">
    <FOLDER NAME="ABC" GROUP="" OWNER="Administrator" SHARED="SHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="3b13d2c9-39dc-426f-8320-def2bb8424ef"/>
  </REPOSITORY>
</POWERMART>

$ FLDR='DEF'
$ xmlstarlet ed -u '/POWERMART/REPOSITORY/FOLDER[@NAME="ABC"]/@NAME' -v "$FLDR" file.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">
<POWERMART CREATION_DATE="12/01/2016 17:43:15" REPOSITORY_VERSION="184.93">
  <REPOSITORY NAME="PCREPO_BIDEV" VERSION="184" CODEPAGE="UTF-8" DATABASETYPE="Oracle">
    <FOLDER NAME="DEF" GROUP="" OWNER="Administrator" SHARED="SHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="3b13d2c9-39dc-426f-8320-def2bb8424ef"/>
  </REPOSITORY>
</POWERMART>

예를 들어 특정 REPOSITORY항목 과 일치해야 하는 경우NAME

xmlstarlet ed -u '/POWERMART/REPOSITORY[@NAME="PCREPO_BIDEV"]/FOLDER[@NAME="ABC"]/@NAME' -v "$FLDR" file.xml

답변2

이 시도,

sed -i 's/<FOLDER NAME="[A-Z]*"/<FOLDER NAME="'$FLDR'"/g' Gather.XM

답변3

sed 표현식에 .모든 문자와 일치하는 " " 가 누락되었습니다.

 sed -i "s/<FOLDER NAME=\"\.*\"/<FOLDER NAME=\"$FLDR\"/g" Gather.XML

답변4

[^\"]*대신 이렇게 해야 할 것 같습니다 \*.

sed -i "s/<FOLDER NAME=\"[\"]*\"/<FOLDER NAME=\"$FLDR\"/g" Gather.XML

첫 번째 텍스트까지 모든 텍스트를 일치시키고 싶기 때문입니다 ". \*리터럴 문자와 일치 *하지만 해당 문자가 없으므로 파일 내용이 일치하지 않습니다.

관련 정보