替换其他文件中文件中的第n行

问题描述

我在不同的子目录中有许多文件,其中一个子目录的第6行包含一个具有正确信息的文件,其他子目录仅包含虚拟信息。目录结构如下:

Folder-1
    Subfolder-1
        File-A
   SubfFolder-2
        File-B
    Subfolder-3
        File-B
Folder-2
    ...
Folder-3
...
File-A中的

Subfolder-1在第6行包含正确的文本,该文本对于每个Folder来说都是不同的字符串。 File-B包含虚拟文字

E1 E2 E3 E4 E5 N
在第6行中的

。此伪文本在每个Folder中也相同。我需要用每个Folder中的正确行替换此虚拟行,以便一个File中的每个Folder在第6行包含相同的字符串。

我的猜测是sed是正确的工具,但我不知道如何设置它以使用不同的字符串作为输入。基础是

sed -i 's/String1/String2/g' file

我设想的粗略草图是:

for i in */;
     do for j in 2 3;
     do sed  6th line in "$i"Subfolder-1/File-A > 6th line in "$i"Subfolder-"$j"/File-B               % Magic needed
done
done

解决方法

Sed可以在文件中打印特定行:

sed -n '6p' file
# store it to a variable via
replacement=$(sed -n '6p' file)

您可以删除旧的第6行,并在第7行之前插入新的第6行,而不是替换(如果第6行与文件中的其他行匹配,则效果不佳)。

sed -i -e '6d' -e "7i$replacement" file
,

让我们分阶段进行吧。

我们将需要find命令。查找所有文件夹:

find . -name "Folder-*"

到目前为止,太好了。现在要对每个文件夹执行以下操作:

find . -name "Folder-*" | while read dname; do
  echo $dname
done

现在从File-A中提取好行:

find . -name "Folder-*" | while read dname; do
  echo $dname
  good=`sed -n '6p' $dname/Subfolder-1/File-A`
  echo $good
done

现在使用特定于文件夹的内部find查找所有文件B:

find . -name "Folder-*" | while read dname; do
  echo $dname
  find $dname -name File-B
done

现在通过内部find执行sed命令并用“占位符”替换第六行来修改每个文件:

find . -name "Folder-*" | while read dname; do
  echo $dname
  find $dname -name File-B -exec sed -i '' "6s/.*/placeholder/" {} \;
done

现在将它们放在一起,并使用变量good

find . -name "Folder-*" | while read dname; do
  good=`sed -n '6p' $dname/Subfolder-1/File-A`
  find $dname -name File-B -exec sed -i '' "6s/.*/$good/" {} \;
done