파일에 나열된 파일 경로를 찾고 바꾸는 방법

파일에 나열된 파일 경로를 찾고 바꾸는 방법

아래와 같은 내용의 파일이 있습니다. 줄에 ".idt"라는 단어가 있으면 그 앞에 파일 경로(예: /bin/dir/test/abcdef.idt)가 있는지 확인해야 합니다. 그렇다면 파일 경로를 제거하고 실제 파일 이름만 유지하십시오(예: abcdef.idt). idt 파일은 항상 절대 경로로 언급될 필요는 없습니다. 단지 파일 이름일 수도 있습니다. 한 줄에 하나의 idt 파일만 언급할 수 있습니다(< file>..</file> 태그 사이). 이 작업은 디렉터리의 모든 파일에 대해 수행되어야 합니다.

아래 예에서는emptyst1.idt,emptytest2.idt,emptyst3.idt가 포함된 3개의 라인을 참조하십시오.

입력 파일 내용의 예(xml 파일):

<Application Name="empBnf" ServiceType="SOAP" BitMode="32" Path="/test/bin"/>
<FileList>
    <File>/test/src/repos/emp.deploy/emptest1.idt</File>
    <File>emptest2.idt</File>
    <File>
          /test/src/repos/emp.deploy/emptest3.idt
     </File>
    <File>/test/src/repos/emp.deploy/emptest.wsdl</File>
</FileList>
<Service Qualifier="http://www.mytest.com/test/empbnf" Name="/test/src/repos/empBnf" XManagement="Container">
    <Operation>Operation</Operation>
</Service>

출력은 다음과 같아야 합니다.

<Application Name="empBnf" ServiceType="SOAP" BitMode="32" Path="/test/bin"/>
<FileList>
    <File>emptest1.idt</File>
    <File>emptest2.idt</File>
    <File>
          emptest3.idt
     </File>
    <File>/test/src/repos/emp.deploy/emptest.wsdl</File>
</FileList>
<Service Qualifier="http://www.mytest.com/test/empbnf" Name="/test/src/repos/empBnf" XManagement="Container">
    <Operation>Operation</Operation>
</Service>

답변1

당신이 사용할 수있는:

sed -i -E -e 's/(\/.*\/)(.*\.idt)/\2/' file_list

-i그러면 모든 파일 경로 ("모두": 파일에서 각 줄의 첫 번째 항목)에서 /..../filename.idt내부( ) 교체가 수행 됩니다. filename.idt파일 이름 앞에 절대 경로가 없으면 정규식은 일치하지 않으며 아무 일도 일어나지 않습니다. 명령 프롬프트에서 file_list등으로 대체 할 수 있습니다. 출력이 디스크에 기록되기 전에 먼저 *.xml옵션 없이 명령을 실행해 볼 수 있습니다 .-i

답변2

XML이 올바른 형식이라고 가정하면 다음 코드는 이를 포함하는 각 노드의 값에서 문자열을 제거하고 /test/src/repos/emp.deploy/XMLStarlet을 사용하여 문자열을 제거합니다(또는 오히려 나중에 경로에 나타나는 값의 비트를 보존합니다).File.idt

xmlstarlet ed -u '//File[contains(., "/test/src/repos/emp.deploy/") and contains(., ".idt")]' \
              -x 'substring-after(., "/test/src/repos/emp.deploy/")' file.xml

root샘플 문서에 노드를 추가 하고 위 명령을 실행하면 다음이 생성됩니다.

<?xml version="1.0"?>
<root>
  <Application Name="empBnf" ServiceType="SOAP" BitMode="32" Path="/test/bin"/>
  <FileList>
    <File>emptest1.idt</File>
    <File>emptest2.idt</File>
    <File>emptest3.idt
     </File>
    <File>/test/src/repos/emp.deploy/emptest.wsdl</File>
  </FileList>
  <Service Qualifier="http://www.mytest.com/test/empbnf" Name="/test/src/repos/empBnf" XManagement="Container">
    <Operation>Operation</Operation>
  </Service>
</root>

다음이 작동하면 더 깔끔할 것입니다.

xmlstrlet ed -u '//File[contains(., ".idt")]' \
             -x 'replace(.,".*/","")' file.xml

...하지만 내 시스템의 XMLStarlet은 해당 기능에 대해 알고 싶어하지 않는 것 같습니다 replace().

답변3

I Have used below method

command: sed '/idt/s/\/test.*emp.deploy\///g' file

산출

sed '/idt/s/\/test.*emp.deploy\///g' file1
<Application Name="empBnf" ServiceType="SOAP" BitMode="32" Path="/test/bin"/>
<FileList>
    <File>emptest1.idt</File>
    <File>emptest2.idt</File>
    <File>
          emptest3.idt
     </File>
    <File>/test/src/repos/emp.deploy/emptest.wsdl</File>
</FileList>
<Service Qualifier="http://www.mytest.com/test/empbnf" Name="/test/src/repos/empBnf" XManagement="Container">
    <Operation>Operation</Operation>
</Service>

관련 정보