<?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/REPOSITORY
NAME
ABC
FLDR
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
첫 번째 텍스트까지 모든 텍스트를 일치시키고 싶기 때문입니다 "
. \*
리터럴 문자와 일치 *
하지만 해당 문자가 없으므로 파일 내용이 일치하지 않습니다.