【问题标题】:How to replace a string in multiple files?如何替换多个文件中的字符串?
【发布时间】:2014-10-13 21:45:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 文件在哪里?在同一个文件夹中?
  • 更改你的error()函数来添加“ERROR”前缀不是更容易吗?

标签: python linux perl sed


【解决方案1】:

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

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

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

【讨论】:

  • 这可能已经为某些特定的输入文件集产生了预期的输出,但通常在几个方面是错误的,在给定不同的文件名和目录内容的情况下会导致令人惊讶的失败。切勿在 ls 的输出中使用 for 并始终引用您的变量,除非您完全了解后果并有特定的目标。这种方法的正确语法是for f in *.c; do sed '...' "$f" > "new_reset/$f"; done,但请参阅@branch14 的答案以获得更好的方法。
  • -1 用于添加多余且错误的命令替代,而不是坚持简单的通配符。
【解决方案2】:

只需将您的 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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        你可以使用sed的选项-i

        引用 sed 的手册页:

        -i[SUFFIX], --in-place[=SUFFIX]
        
              edit files in place (makes backup if extension supplied)
        

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

        在你的情况下

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

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

        【讨论】:

          猜你喜欢
          • 2017-08-01
          • 1970-01-01
          • 2019-01-07
          • 1970-01-01
          • 2018-10-29
          • 2015-11-22
          • 1970-01-01
          相关资源
          最近更新 更多