如何在不进行硬编码的情况下添加特定行中的字符串

如何在不进行硬编码的情况下添加特定行中的字符串

我有 2 个文件,第一个文件有输出,另一个文件有模板。我想从输出中在模板中添加 ID,而不对值进行硬编码。

 Output.txt,
      abc  8392382222
      def  9283923829
      ghi  2392832930

Template file,
    Pool : 1
      Some text
      Some text
      Some text
      name:
      no:
      London
      UK
      name:
      no:
      London
      UK
      name:
      no:
      London
      UK

    Pool : 2
      Some text
      Some text
      Some text
      name:
      no:
      London
      UK
      name:
      no:
      London
      UK
      name:
      no:
      London
      UK

我想在模板中添加输出行,如下所示

    Pool : 1
      Some text
      Some text
      Some text
      name: abc
      no: 8392382222
      London
      UK
      name: def
      no: 9283923829
      London
      UK
      name: ghi
      no: 2392832930
      London
      UK

    Pool : 2
      Some text
      Some text
      Some text
      name: abc
      no: 8392382222
      London
      UK
      name: def
      no: 9283923829
      London
      UK
      name: ghi
      no: 2392832930
      London
      UK

答案1

仅使用 bash,您可以同时读取两个文件:只需将其重定向到不同的文件描述符即可。

#!/bin/bash
while read -r -a values ; do
    for i in {0..3} ; do
        read -u 3 line
        echo "$line ${values[$i]}" 
    done
done < output.txt 3<template.txt

请注意,通常模板文件只包含应重复的四行,因此您可以将其读入数组处理包含值的文件,因此您不需要任何额外的描述符:

#!/bin/bash
template=()
while read -r line ; do
    template+=("$line")
done < template.txt

while read -r -a values ; do
    for (( i=0; i<${#template[@]}; ++i )) ; do
        echo "${template[$i]} ${values[$i]}" 
    done
done < output.txt

答案2

perl

perl -pe '
  unless (s{^\h*name:\K\h*$}{($name,$no) = split " ", <STDIN>; " $name"}e) {
    s{^\h*no:\K\h*$}{ $no}
  }' template < Output.txt

添加就地-i编辑template文件的选项,而不是在标准输出上生成结果。

这会保留h和 之前的水平间距no:name:如果有),并用单个空格和从Output.txt(在 上打开STDIN)检索到的值替换后面的间距。

相关内容