0

私は次の問題を抱えています-特定のディレクトリの下にあるすべてのxmlファイルをトラバースし、id見つけたすべての-sに特定のプレフィックスを付けたいです。これを行うために、次のスクリプトを作成しました。

#!/bin/bash
find . -iregex .+?\.xml -print -exec awk '{print gensub(/(.*?)=\"(@(\+|)id)\/(.+)\"/, "\\1=\"\\2/prefix_\\4\"", "g", $1);}' {} > {} \;

ただし、リダイレクト部分> {}は機能しません。スクリプトは正常に実行され、stdoutで期待どおりにすべてを出力しますが、出力をawkが読み取ったのと同じファイルにリダイレクトできないようです。これを回避する方法はありますか?ありがとう!

4

1 に答える 1

0

代わりにbashするためにそれを実行します:

find . -iregex .+\.xml -print \
-exec bash -c "awk '{print gensub(/(.*?)=\\"(@(\+|)id)\/(.+)\\"/, \"\\1=\"\\2/prefix_\\4\\"\", \"g\", \$1);}' {} > {}.NEW" \;

それはあなたが読んでいるファイルを完全に上書きします(それが.NEW私がリダイレクトしているファイルに追加した理由です)。おそらくあなたが欲しかったのは>>(追加)リダイレクタでしたか?


質問でサンプルファイルを提供しなかったため、完全に機能する例を思い付くのは難しいです。ただし、次のように機能します。

次のような名前のファイルがある場合tmp.xml

I have a "
I do not

そして、実行します:

find . -name '111.xml' -exec bash -c "awk '\$0 ~ /\"/ { print \$0 }' {} > {}.NEW" \;

ファイルtmp.xml.NEWには次のものが含まれます。

I have a "

$シェルはそれらを変数として扱うため、二重引用符に加えて、スクリプトでドル()をエスケープする必要があることに注意してください。

于 2012-06-29T18:22:29.260 に答える