다음과 같은 텍스트 파일이 있습니다 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
문서 루트 노드의 속성을 파일 내용으로 업데이트하고 각 줄 바꿈 문자를 공백으로 바꾸는 데 사용됩니다 .name
Project
branch.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 쿼리를 통해 특정 요소를 업데이트하도록 지정합니다.
name
deploy_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
-L
ed
edit
<?xml ...>
--omit-decl
-O