하드 코딩 없이 특정 줄에서 문자열을 추가하는 방법

하드 코딩 없이 특정 줄에서 문자열을 추가하는 방법

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

일반적으로 템플릿 파일에는 반복되어야 하는 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

관련 정보