使用awk查找并替换find中找到的文件中的字符串

时间:2014-01-16 22:39:51

标签: regex linux bash command-line awk

我正在使用find来获取目录中的一堆文件,然后awk尝试在其中查找/替换字符串。但是,awk只是将文件的全部内容打印到stdout而不是覆盖文件。关于我应该用什么语法来实现我的目标,我有点困惑。

到目前为止我的命令是:

find -iname '*_input.xml' -exec awk -P '/"prop_name" : "ID",/ , /}/ {print sub(/SKU/,"SKU+ProductId")} 1' {} +

这是用SKU替换字符串SKU+ProductId但不覆盖文件。

任何人对我失踪的内容有任何想法吗?

干杯!

更新 示例内容:

          },
      "prop_name" : "ID",
      "rule" : "SKU"
   },

3 个答案:

答案 0 :(得分:3)

awk写入标准输出,因此您需要重定向标准输出。您可以通过执行内部shell命令find来执行此操作:

find -iname '*_input.xml' \
     -exec sh -c 'for file; do
       ./awk_script "$file" > "$file.tmp" && mv "$file.tmp" "$file"
      done' _ {} +

我会将awk命令移动到自己的文件中以避免引用问题。您可能还需要考虑保存覆盖原始文件的任务,直到您检查结果为止。

我相信你可以像这样创建一个awk文件。不要忘记chmod +x它。

#!/usr/bin/awk -f

/"prop_name" : "ID",/ , /}/ {
    print sub(/SKU/,"SKU+ProductId")
} 1

答案 1 :(得分:2)

GNU sed有一个-i用于现场编辑,这使得这更容易:

find -iname '*_input.xml' \
  -exec sed -i '/"prop_name" : "ID",/ , /}/ s/SKU/SKU+ProductId/' {} +

答案 2 :(得分:2)

您需要使用带有-i infile选项的新版GNU awk(4.?)并删除print