bash에서 PATH 요소를 xml 파일의 SED로 검색하고 바꾸는 방법

bash에서 PATH 요소를 xml 파일의 SED로 검색하고 바꾸는 방법

예제 경로 태그의 현재 요소를 다음으로 바꾸고 싶습니다.

...
<examples>
<example path='/test/test123/test12345.txt'/>
<examples>
...

도착하다

...
<examples>
<example path=/test/test123/>
<examples>
...

그리고

sed -i 's/<example path=\/test\/test123\/test12345.txt'>/<example path=\/test\/test123\/>' 123.xml

그러나 그것은 말한다:

-bash: example: No such file or directory

답변1

작은따옴표가 일치하지 않아 오류가 발생합니다.

따옴표 붙은 문자열은 두 번째 따옴표로 끝납니다. 쉘은 인용 해제된 내용을 보고 >/<example이를 리디렉션으로 해석합니다.

또한 sed명령이 불완전합니다. /후행 구분 기호가 누락되었습니다.

sed편집된 입력 데이터와 일치하도록 명령 도 수정했습니다 .

명령에 작은따옴표를 사용 하려면 sed명령 주위에 큰따옴표를 사용해야 하며 큰따옴표 안의 내용이 셸에 의해 확장되지 않도록 해야 합니다.

sed -i "s/<example path='\/test\/test123\/test12345.txt'\/>/<example path=\/test\/test123\/>/" 123.xml

또는 다음과 같이 이스케이프된 작은따옴표를 사용하세요.

sed -i 's/<example path='\''\/test\/test123\/test12345.txt'\''\/>/<example path=\/test\/test123\/>/' 123.xml

참고: /슬래시가 아닌 다른 구분 기호를 사용하는 경우 패턴이나 대체에서 슬래시를 이스케이프 처리할 필요가 없습니다.

sed -i "s#<example path='/test/test123/test12345.txt'/>#<example path=/test/test123/>#" 123.xml
sed -i 's#<example path='\''/test/test123/test12345.txt'\''/>#<example path=/test/test123/>#' 123.xml

질문에 표시된 원하는 출력이 유효한 XML이 아닙니다. 속성은 인용되어야 합니다.

답변2

XML을 편집하려면 XML 편집기를 사용해야 합니다. 파일의 XML 스키마 레이아웃 변경, 예상치 못한 주석 등을 처리할 수 있습니다. 내 첫 번째 선택은xmlstarlet

샘플 파일,x.xml

<root>
  <examples/>
  <example path='/test/test123/test12345.txt'/>
  <examples/>
</root>

path모든 요소의 속성을 example값으로 업데이트하는 명령/test/test123

xmlstarlet ed --update '//example/@path' --value '/test/test123' x.xml

산출

<?xml version="1.0"?>
<root>
  <examples/>
  <example path="/test/test123"/>
  <examples/>
</root>

답변3

sed -i -e s/test\///g 123.xml 그냥 삭제하고 sed -i -e s/test\//replacement/g 123.xml 다른걸로 바꾸세요

관련 정보