我正在使用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"
},
答案 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
。