我想替换多个文件中出现的字符串。对于单个文件,我可以使用unix命令:
sed 's/error("/printf( "ERROR : /g' all_reset_test.c > new_reset/all_reset_test.c
将此文件中的所有'error("'
替换为'printf( "ERROR : '
。
但我有超过100个文件,我需要这样做。我正在寻找如何在perl或python脚本中一次性为所有文件运行此命令。
答案 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详细说明了一些选项。