PATH 요소를 bash에서 여러 XML 파일의 SED로 교체

PATH 요소를 bash에서 여러 XML 파일의 SED로 교체

1개의 xml 파일을 성공적으로 교체했습니다. 그러나 나는 test1.xml에서 까지 10개의 경로를 갖고 test30.xml있으며 끝에는 다른 경로가 있습니다.

  • test1.xml
    ...
    <examples>
    <example path='/test/test123/st1.txt'/>
    <examples>
    ...
    
  • test2.xml
    ...
    <examples>
    <example path='/test/test123/te2.txt'/>
    <examples>
    ...
    

까지 기다리다

  • test30.xml
    ...
    <examples>
    <example path='/test/test123/removethispart.txt'/>
    <examples>
    ...
    

산출다음과 같아야 합니다.

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

이전에 이것을 사용한 적이 있으며 파일을 변경할 수 있습니다

sed -i "s#<example path='/test/test123/st1.txt'/>#<example path=/test/test123/>#" test1.xml

그러나 한 번에 여러 파일을 변경하고 다음 스크립트를 실행하고 싶지만 catxml 파일에는 변경 사항이 표시되지 않습니다.

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

어떤 도움이라도 대단히 감사하겠습니다. 시간 내 주셔서 감사합니다!

답변1

문제의 원인은 정규식 패턴이 예상되는 "쉘 글로브"(일명 "와일드카드") 패턴을 사용하고 있다는 것입니다.

이 부분은 /test/test123/*.txt실제로 " /test/test123, 0개 이상의 /문자, 단일 문자, 마지막으로 txt"를 의미합니다.

이 패턴은 원하는 패턴이 아니며 파일에 존재하지 않습니다.

대신에 원하는 것은 /test/test123/[^.]*\.txt" /test/test123/와 그 뒤에 원하는 수의 문자가 오는 것을 의미합니다.아니요( .이것이 필요한 이유는 "탐욕스러운 정규 표현식"을 참조하십시오)문자 그대로의 의미., txt".

전체 명령은 다음과 같습니다

sed -i "s#<example path='/test/test123/[^.]*\.txt'/>#<example path='/test/test123/'>#" *.xml

노트

.파일 이름에 .txt확장명 이외의 다른 내용이 포함될 수 있으면 위의 방법이 작동하지 않습니다. 이 경우에는 다음을 사용하십시오.

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

" /test/test123/, 그 뒤에 모든 유형의 0개 이상의 문자, 리터럴 ., txt"가 뒤따르는 것을 의미합니다. 나중에 패턴이 해당 행에 다시 나타나지 않는 한 제대로 작동합니다 .txt(입력한 경우에는 발생하지 않음).

답변2

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

이것은 내 문제를 해결했습니다. 모두를 응원합니다! :)

관련 정보