如何查找和替换文件中列出的文件路径

如何查找和替换文件中列出的文件路径

我有一个文件内容如下所示。如果一行有“.idt”单词,那么我需要检查它前面是否有文件路径(例如:/bin/dir/test/abcdef.idt)。如果是,则删除文件路径并仅保留实际文件名(例如:abcdef.idt)。 idt 文件不必总是以绝对路径提及;它可以只是文件名。一行中只能提及一个 idt 文件(在一个 < file>..</file> 标记之间)。需要对目录中的所有文件执行此操作。

在下面的示例中,请参阅包含 emptest1.idt、emptest2.idt 和 emptest3.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>

相关内容