linux - 对大量文件运行相同的 sed 转换

标签 linux shell sed

我编写的某些代码中的错误导致某些文件格式不正确。如果只有一个文件,我可以写

cat filename | sed 's/bad/good/g' >filename2
mv filename2 filename

并修复它。但是,我有数百个文件,我想对所有文件进行相同的转换。

有没有什么方法可以使用 sed 对大量文件应用相同的转换,同时保持文件名相同?

sed 是这项工作的正确工具吗?如果没有,我应该使用什么?

最佳答案

在现代版本的 sed 上使用 -i(就地)选项。

sed -i 's/bad/good/g' file*pattern

或者,通过查找

find . -type f -name 'file*pattern' -print0 | xargs -0 sed -i 's/bad/good/g'

如果您担心出现问题,您可以提供一个后缀作为 -i 的参数,每个文件的备份副本将在应用转换之前使用该后缀保存:

sed -i.bak 's/bad/good/g' filename
diff filename.bak filename

如果你的 sed 版本不支持 -i 选项,你总是可以使用 perl,这就是 sed 的灵感来源(这很公平,因为 perl 的大部分命令行语法都来自来自 sed):

perl -pi.bak -e 's/bad/good/g' filenames

关于linux - 对大量文件运行相同的 sed 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10423944/

相关文章:

linux - 从 cat 加载变量到内存

linux - 如何仅将最新的子目录复制到目标 linux shell 脚本

linux - 使用 sed 逐行提取 xml 标记的多个参数

replace - 递归多行替换: changing copyright headers

regex - SH CLI sed 从列表中删除除路径之外的所有字符

linux - 在 SUSE 上的任何包含文件夹下都找不到 zlib.h,但存在 libz.so.1

c++ - QMediaPlayer 和 gstreamer 系统崩溃

linux - Jenkins 在 "Execute shell"步骤期间生成无限数量的进程

android - 如何在没有用户交互的情况下创建 AVD?

linux - 如何在ubuntu中提取.tar.gz文件