
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
ただし、一度に複数のファイルを変更して次のスクリプトを実行したいのですが、cat
xmlファイルには変更は表示されません。
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
(入力した場合は発生しません)。
答え2
sed -i "s#<example path='/test/test123/.*\.txt'/>#<example path='/test/test123/'>#" *.xml
これは私の問題を解決しました。みんなを応援します! :)