ファイルにリストされているファイルパスを見つけて置き換える方法

ファイルにリストされているファイルパスを見つけて置き換える方法

以下の内容のファイルがあります。行に「.idt」という単語がある場合は、その前にファイルパス(例:/bin/dir/test/abcdef.idt)があることを確認する必要があります。その場合は、ファイルパスを削除して実際のファイル名のみを保持してください(例:abcdef.idt)。 idtファイルは常に絶対パスと呼ばれる必要はありません。ただファイル名にすることもできます。 1行に1つの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>

関連情報