perl 查找和替换所有子目录中文件中的文本[duplicate]

a0x5cqrl  于 2022-11-24  发布在  Perl
关注(0)|答案(2)|浏览(183)

此问题在此处已有答案

How can I do a recursive find/replace of a string with awk or sed?(37个答案)
七年前就关门了。
在Mac电脑上,我使用Hazel运行一个shell脚本,以便在我的Downloads文件夹的多个子目录中查找和替换.txt文件中的文本。script.sh
script.sh目前的外观如下:

#!/bin/bash
cd /Users/admin/Downloads/
perl -pi -w -e 's/OldText/NewText/g;' *.txt

它可以工作,但是不能查看下载目录中的所有子目录。我该怎么做呢?

jq6vz3qz

jq6vz3qz1#

使用findxargs
类似于(NOT TESTED!)的内容:

find /Users/admin/Downloads/ -type f -print0 | xargs -0 perl -pi -w -e 's/OldText/NewText/g;'
gijlo24d

gijlo24d2#

我不确定为什么在这种情况下需要perl,也不确定Hazel是谁,为什么她要运行您的shell脚本,但是既然您已经将问题标记为shell,并且显然正在使用bash,我将提供一个仅适用于shell的答案。注意,这也适用于其他shell,而不仅仅是bash。

#!/bin/bash

find /Users/admin/Downloads/ -type f -name "*.txt" \
  -exec sed -i '' -e 's/OldText/NewText/g' {} \;

请注意,为了便于阅读,此find命令分为两行。它使用sed而不是perl,因为sed更小,可能更快,并且被视为标准shell工具,而perl可能并不适用于所有系统。
还要注意,我使用的sed选项的确切语法可能取决于系统上sed的实现。
find命令的工作方式如下:

find [path ...] [command ...]

您可以使用man find查看详细信息,但我在这里提供的命令将执行以下操作。

  • 开始于/Users/admin/Downloads/
  • -type f-查找文件(而不是目录或符号链接)
  • -name "*.txt"-AND查找与此文件规范匹配的内容
  • -exec ...-AND执行以下shell命令,用找到的文件名替换{}

相关问题