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、ゼロ個以上の/文字、単一文字、最後に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(入力した場合は発生しません)。

おすすめ記事