如何替换多个文件中的字符串?

时间:2014-08-20 13:42:48

标签: python linux perl sed

我想替换多个文件中出现的字符串。对于单个文件,我可以使用unix命令:

sed 's/error("/printf( "ERROR : /g' all_reset_test.c > new_reset/all_reset_test.c 

将此文件中的所有'error("'替换为'printf( "ERROR : '

但我有超过100个文件,我需要这样做。我正在寻找如何在perl或python脚本中一次性为所有文件运行此命令。

5 个答案:

答案 0 :(得分:1)

例如,如果您的文件的扩展名为.txt,则可以使用:

%> perl -pi -e 's/error("/printf( "ERROR : /' *.txt

答案 1 :(得分:1)

您可以使用sed的选项-i

引自sed的联机帮助页:

-i[SUFFIX], --in-place[=SUFFIX]

      edit files in place (makes backup if extension supplied)

如果省略SUFFIX sed,则在修改文件之前不会创建备份。

在你的情况下这个

sed -i 's/error("/printf( "ERROR : /g' *.c

应该完成这项工作(没有pyhton,perl或bash循环)。

答案 2 :(得分:0)

您可以使用简单的bash for循环将此逻辑应用于所有文件:

for f in $(ls *.c); do 
   sed 's/error("/printf( "ERROR : /g' ${f} > new_reset/${f}
done

$(ls *.c)部分应替换为ls命令将选择要应用sed命令的文件。

答案 3 :(得分:0)

只需将sed命令包裹在for周期中:

for file in $(cat file_list)
do
    sed 's/error("/printf( "ERROR : /g' $file > new_reset/$file
done

当然,要编辑的文件列表可以通过多种方式获得:

for file in $(ls *.c)  # if the files are in the same folder
do
    sed 's/error("/printf( "ERROR : /g' $file > new_reset/$file
done

或者

for file in $(find -type f -name '*.c')
do
    sed 's/error("/printf( "ERROR : /g' $file > new_reset/$file
done

答案 4 :(得分:0)

您可以迭代shell中的文件,例如这将查找当前目录下的子目录中的所有.txt个文件。每个文件都在$f

中提供
for f in $(find . -name \*.txt); do
   # run my sed script for $f
done

使用bash迭代一组文件有很多选项。有关选项,请参阅here。如果文件名有空格,则必须小心,this SO question/answer详细说明了一些选项。