【问题标题】:Replace nth line in file from different file从不同的文件替换文件中的第 n 行
【发布时间】:2021-01-16 05:10:18
【问题描述】:

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

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

Subfolder-1 中的File-A 包含第 6 行中的正确文本,这是每个 Folder 都不同的字符串。 File-B 包含虚拟文本

E1 E2 E3 E4 E5 N

在第 6 行。这个虚拟文本在每个 Folder 中也是相同的。我需要在每个Folder 中用正确的行替换这个虚拟行,以便一个Folder 中的每个File 在第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

【问题讨论】:

    标签: bash sed text-processing


    【解决方案1】:

    让我们分阶段进行。

    我们需要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 查找所有 File-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
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-18
        • 2015-11-26
        • 1970-01-01
        • 2018-04-14
        • 2013-08-30
        • 2020-01-27
        • 1970-01-01
        • 2021-07-26
        相关资源
        最近更新 更多