Perl 如何替换文件中的字符串和;“保存”;将其作为另一个文件保存

Perl 如何替换文件中的字符串和;“保存”;将其作为另一个文件保存,perl,bash,sed,Perl,Bash,Sed,我正在尝试替换一堆*.txt文件中的字符串。我熟悉这个命令: find "$folder" -type f -name '*.txt' -exec sed -i 's/REPLACEFROM/REPLACETO/g' {} \; 但是,这个(根据-i标志)替换了原有的字符串 我想做的是保持所有原始文件完好无损,并将更改后的文件“保存”为“file1重命名的.txt”、“file2重命名的.txt” 最快最优雅的方式是什么?也许是perl 我相信这是非常基本的,但对我来说似乎很难 提前感谢您的帮

我正在尝试替换一堆*.txt文件中的字符串。我熟悉这个命令:

find "$folder" -type f -name '*.txt' -exec sed -i 's/REPLACEFROM/REPLACETO/g' {} \;
但是,这个(根据-i标志)替换了原有的字符串

我想做的是保持所有原始文件完好无损,并将更改后的文件“保存”为“file1重命名的.txt”、“file2重命名的.txt”

最快最优雅的方式是什么?也许是perl

我相信这是非常基本的,但对我来说似乎很难

提前感谢您的帮助。

使用sed,您可以使用

 sed -i.back
这样,原始文件将移到*.back

或者将此片段用作最接近您的问题:

find "$folder" -type f -name '*.txt' -exec bash -c '
    cp "$1" "${1%.*}-renamed.txt"
    sed -i 's/REPLACEFROM/REPLACETO/g' "${1%.*}-renamed.txt"
' -- {} \;

这不完全是一行,但它应该是一个技巧(在我看来,它更容易阅读):

使用严格;
使用警告;
while(@ARGV)
{
我的$file=shift;
打开(我的$read,“,$output_文件)或die$!;
while()
{
咀嚼;
s/REPLACEFROM/REPLACETO/g;
打印$write“$\n”;
}
关闭($读取);
关闭($write);
}

使用perl,您可以尝试以下方法:

find "$folder" -name '*.txt' |
  xargs perl -ne 'open NEW, ">>$ARGV.new"; s/from/to/g; print NEW'
这将把新文件保存为old-name.txt.new。如果您真的想要“old name renamed.txt”格式,您可能需要更改它。还要注意,它会在每次执行oneliner之后附加到新文件中

当然,使用-i选项(
…perl-i.old-pe's/from/to/g'
)然后将文件批量重命名为所需的名称格式会更容易,因此只有在无法访问原始文件进行写入时,此解决方案才有意义。

这可能适用于您:

find "$folder" -type f -name '*.txt' |
parallel sed 's/REPLACEFROM/REPLACETO/g' ">" {.}-renamed.txt
我已经在这里发布了一个解决方案,但今天我想到了另一个解决方案:

for f in (find "$folder" -name '*.txt'); do perl -ne 's/from/to/g' $f > "$f.new"; done
同样,它会将修改后的内容保存到“old name.txt.new”(如果需要,您可以将其更改为类似于
…>“$(basename$f)-重命名的.txt”…


这个答案比我以前的答案更好,因为它不需要为每一行打开同一个文件。

Perl还有一个
-i
开关,其工作方式相同:
-i.bak
将保存原始文件,并在文件名后附加
.bak
for f in (find "$folder" -name '*.txt'); do perl -ne 's/from/to/g' $f > "$f.new"; done