Linux 搜寻及;替换为包含文件夹名称的多个文件

Linux 搜寻及;替换为包含文件夹名称的多个文件,linux,perl,sed,terminal,find,Linux,Perl,Sed,Terminal,Find,我有多个名称为的文件夹: 1_1,1_2,...,2_1,..., 每个文件夹都包含名称为file.sh的相同文件。该文件的格式如下: 作业名称=名称 分区=长 我想在终端(Linux)中对我的所有文件夹使用搜索和替换命令,例如下面的 find . -type f -name "file.sh" -print |xargs sed -i 's/job_name/REPLACED_TEXT/g' 在被替换的文本的位置,我想要文件夹的名称。例如,在文件夹1_1中,将有文件.sh文件,其格式为:

我有多个名称为的文件夹:

1_1,1_2,...,2_1,...,
每个文件夹都包含名称为
file.sh
的相同文件。该文件的格式如下:

作业名称=名称

分区=长

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

find . -type f -name "file.sh" -print |xargs sed -i 's/job_name/REPLACED_TEXT/g'
在被替换的文本的位置,我想要文件夹的名称。例如,在文件夹
1_1
中,将有
文件.sh
文件,其格式为:

作业名称=1\u 1

分区=长


我还没有找到解决办法

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

./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

您可以尝试此行打印所有要执行的
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 -------------------------^