【问题标题】:Search&Replace into multiple files with the name of the containing folder使用包含文件夹的名称搜索并替换为多个文件
【发布时间】:2014-08-06 18:00:22
【问题描述】:

我有多个文件夹名称:

1_1,1_2,...,2_1,...,

这些文件夹中的每一个都包含名称为file.sh 的相同文件。文件格式如下:

job_name=NAME

分区 =

我想在终端 (Linux) 中对我的所有文件夹使用搜索和替换命令,例如以下

find . -type f -name "file.sh" -print |xargs sed -i 's/job_name/REPLACED_TEXT/g'

REPLACED_TEXT的位置我想要文件夹的名字。例如,在文件夹1_1内,会有file.sh文件修改后的形式:

job_name=1_1

分区 =

我还没有找到解决方案。

【问题讨论】:

    标签: linux perl sed terminal find


    【解决方案1】:

    你可以试试这行打印所有你想执行的sed命令:

    find . -type f -name 'file.sh' | \
        sed 's=\(.*\)/\([^/]*\)=sed -i "s/NAME/\1/" \"&\"='
    

    对于我们找到的每个文件,它会提取其目录的名称并创建一个sed 命令,可以用它替换NAME
    输出应该是这样的:

      sed -i "s/NAME/1_1/" "1_1/file.sh"
      sed -i "s/NAME/1_2/" "1_2/file.sh"
    

    然后,如果它看起来不错,您可以对sed 重复使用e 命令,这将使外部sed 执行其结果(即内部sed 命令),如下所示:

    find . -type f -name 'file.sh' | \
        sed 's=\(.*\)/\([^/]*\)=sed -i "s/NAME/\1/" \"&\"=e'
        # 'e' command added here -------------------------^
    

    【讨论】:

      【解决方案2】:

      您没有指定可能需要遍历多少个子目录,例如

      ./1_1/file.sh
      ./1_2/file.sh
      ./a/b/c/1_1/file.sh
      

      因此,我将假设一个子目录如下:

      ./1_1/file.sh
      ./1_2/file.sh
      

      像下面这样的东西应该可以让你开始,而不是经过测试,只是把它写在我的脑海里。它是 bash 脚本的,但你可以将它变成一个大而长的命令。请务必先备份您的目录,以防脚本出现不可预知的结果。

      for i in `find . -type f -print "file.sh"`; 
          do
          subdir=`echo $i | awk -F\/ '{print $2}'`
          sed -e s/job_name=NAME/jobname=$subdir/ $i > $i.bak
          mv $i.bak $i
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-30
        • 2020-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多