0

我遇到了以下问题 - 我想遍历某个目录下的所有 xml 文件,并为id我找到的所有 -s 加上某个前缀。我编写了以下脚本来做到这一点:

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

但是重定向部分 -> {}将不起作用。该脚本将运行良好并按预期在标准输出上打印所有内容,但似乎无法将输出重定向到 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 "

请注意,除了双引号之外,您还必须$在脚本中转义美元 ( ),因为 shell 将它们视为变量。

于 2012-06-29T18:22:29.260 回答