XML 속성에 파일 내용 삽입

XML 속성에 파일 내용 삽입

다음과 같은 텍스트 파일이 있습니다 branch.txt.

$ cat branch.txt
DEMAND_NAME-CR-1234
DEMAND_NAME-CR-8970

위의 브랜치 이름을 사용하여 다음 명령을 사용하여 일부 값을 찾아서 바꿔야 합니다 sed.

branch_name=`(cat /tmp/branch.txt)`
sed -i "s/deploy_branch/$branch_name/g" /tmp/input.file

명령 을 실행하면 sed다음과 같은 오류가 발생합니다.

sed: -e expression #1, char 35: unterminated `s' command

예상 출력:

<Project description="first-deployment" name="DEMAND_NAME-CR-1234 DEMAND_NAME-CR-8970 " overwrite="true" type="Repository">
      </Project>

입력 파일:

<Project description="first-deployment" name="deploy_branch" overwrite="true" type="Repository">
      </Project>

답변1

명령의 문제점은 줄 바꿈이 포함되어 있다는 sed것입니다 $branch_name. sed이로 인해 바꾸기 명령을 편집 표현식에 삽입하면 해당 명령의 구문이 손상됩니다 sed.


xmlstarlet문서 루트 노드의 속성을 파일 내용으로 업데이트하고 각 줄 바꿈 문자를 공백으로 바꾸는 데 사용됩니다 .nameProjectbranch.txt

xmlstarlet edit \
    --update '/Project/@name' \
    --value "$(paste -s -d ' ' branch.txt)" input.file

아니면 더 짧게,

xmlstarlet ed \
    -u '/Project/@name' \
    -v "$(paste -s -d ' ' branch.txt)" input.file

paste명령 대체의 명령은 파일을 읽고 branch.txt마지막 문자를 제외한 모든 개행 문자를 공백 문자로 바꿉니다. 그러면 name속성의 새 값 으로 사용되는 문자열이 생성됩니다 . 마지막 개행 문자를 유지하고 이를 후행 공백으로 변환하려면(예상 출력에 표시됨) 이 명령 tr '\n' ' ' <branch.txt대신 in을 사용하십시오.paste

이 유틸리티는 xmlstarlet해당 하위 명령을 통해 호출됩니다. ed이 명령편집하다XML 파일이며 해당 속성과 일치하는 XPath 쿼리를 통해 특정 요소를 업데이트하도록 지정합니다.

namedeploy_branch속성 값이 XPath 쿼리를 사용하거나 /Project/@name[. = "deploy_branch"]대신 사용 되는 경우에만 변경해야 합니까 /Project[@name = "deploy_branch"]/@name?

위 명령의 출력은 다음과 같습니다.

<?xml version="1.0"?>
<Project description="first-deployment" name="DEMAND_NAME-CR-1234 DEMAND_NAME-CR-8970" overwrite="true" type="Repository">
      </Project>

xmlstarlet도구의 앞이나 뒤에 ( ) 옵션을 주면 도구가 제자리에서 편집되도록 할 수 있습니다 . ( )를 사용하면 선언 추가를 피할 수 있습니다.--inplace-Lededit<?xml ...>--omit-decl-O

관련 정보