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

Regex 使用awk查找并替换使用find找到的文件中的字符串,regex,linux,bash,command-line,awk,Regex,Linux,Bash,Command Line,Awk,我使用find获取目录中的一堆文件,然后使用awk尝试查找/替换其中的字符串。但是,awk只是将文件的全部内容打印到标准输出,而不是覆盖文件。我有点困惑,我应该在这里使用什么语法来实现我的目标 到目前为止,我的命令是: find -iname '*_input.xml' -exec awk -P '/"prop_name" : "ID",/ , /}/ {print sub(/SKU/,"SKU+ProductId")} 1' {} + 这将用SKU+ProductId替换字符串SKU,但不会

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

到目前为止,我的命令是:

find -iname '*_input.xml' -exec awk -P '/"prop_name" : "ID",/ , /}/ {print sub(/SKU/,"SKU+ProductId")} 1' {} +
这将用SKU+ProductId替换字符串SKU,但不会覆盖文件

有人知道我遗漏了什么吗

干杯

更新: 示例内容:

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

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它


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它

GNU sed有一个用于就地编辑的-i,这使得编辑变得更加容易:

find -iname '*_input.xml' \
  -exec sed -i '/"prop_name" : "ID",/ , /}/ s/SKU/SKU+ProductId/' {} +
GNU sed有一个用于就地编辑的-i,这使得编辑变得更加容易:

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


您需要使用GNU awk 4的新版本。?使用-i填充选项并去除打印。

您需要使用GNU awk 4的新ish版本。?使用-i infle选项并取消打印。

不确定如何将其放入find命令的-exec中,但这解释了它不起作用的原因:不确定如何将其放入find命令的-exec中,但这解释了为什么它不起作用:因此awk_脚本需要与正在查找的文件位于同一目录中,并且应该是.sh正确的?awk脚本必须位于已知目录中。它的扩展不重要,但是你可以把它放在/在shebang中使用usr/bin/awk-Pf。当我尝试执行此命令时,会出现语法错误。您能否编辑您的答案以显示awk文件的内容?我正在编辑这个问题,以给出一些示例内容。谢谢,这就是使用awk的诀窍!它替换的文件行的开头有一些0和1,但我可以计算出来。太复杂了。。。Excel FTW.so awk_脚本需要与正在查找的文件位于同一目录中,并且应该是.sh正确吗?awk脚本必须位于已知目录中。它的扩展不重要,但是你可以把它放在/在shebang中使用usr/bin/awk-Pf。当我尝试执行此命令时,会出现语法错误。您能否编辑您的答案以显示awk文件的内容?我正在编辑这个问题,以给出一些示例内容。谢谢,这就是使用awk的诀窍!它替换的文件行的开头有一些0和1,但我可以计算出来。太复杂了。。。Excel FTW.ah,这肯定有效,但sed显然不支持多行选项。但减去s,它确实起了作用,这告诉我它必须在默认情况下强制执行。不确定我是否应该接受,因为这是关于awk的,但def+1没有得到爱。它与POSIX兼容,实际上是为编辑文件而设计的,并且是可移植的。但是自从GNU决定使用-i标志并使sed不可移植以来,不仅每个人都忘记了可怜的ed,而且每个人都忘记了如何使用它。wahmbulance@kojiroed不需要嵌入sh和这样的丑陋吗?@另一个人可能需要某种丑陋。但是biiteotb等等,等等@其他人不允许sed regex进行[^]+或。*之类的匹配吗?跨越多条线?当我尝试更进一步地使用类似于中断itah的东西时,这肯定是可行的,但是sed显然不支持多行选项。但减去s,它确实起了作用,这告诉我它必须在默认情况下强制执行。不确定我是否应该接受,因为这是关于awk的,但def+1没有得到爱。它与POSIX兼容,实际上是为编辑文件而设计的,并且是可移植的。但是自从GNU决定使用-i标志并使sed不可移植以来,不仅每个人都忘记了可怜的ed,而且每个人都忘记了如何使用它。wahmbulance@kojiroed不需要嵌入sh和这样的丑陋吗?@另一个人可能需要某种丑陋。但是biiteotb等等,等等@其他人不允许sed regex进行[^]+或。*之类的匹配吗?跨越多条线?当我试着更深入地研究这些东西时,比如说,我会在我有时间更新PKG的时候尝试一下我会在我有时间更新PKG的时候尝试一下