ハードコーディングなしで特定の行に文字列を追加する方法

ハードコーディングなしで特定の行に文字列を追加する方法

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を使用すると、同時に2つのファイルを読み取ることができます。別のファイル記述子にリダイレクトするだけです。

#!/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

通常、テンプレートファイルには繰り返す必要がある4行しか含まれていないため、配列として読み取ることができます。今後値を含むファイルを処理するため、追加の記述子は必要ありません。

#!/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

関連情報