예제 경로 태그의 현재 요소를 다음으로 바꾸고 싶습니다.
...
<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
다른걸로 바꾸세요