问题描述
我在不同的子目录中有许多文件,其中一个子目录的第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