csv 데이터를 사용할 수 있는 bash용 간단한 템플릿 엔진이 있습니까?

csv 데이터를 사용할 수 있는 bash용 간단한 템플릿 엔진이 있습니까?

나는 종종 일부 데이터를 빠르게 가져와 bash의 템플릿에 적용하고 싶습니다.

예를 들어 다음을 수행한다고 상상해보십시오.

  $ seq 1 2 | eztemplate 'this is a {1} test'
  this is a 1 test
  this is a 2 test

  $ eztemplate 'this is a {1} test' hi 'there now'
  this is a hi test
  this is a there now test

  $ eztemplate /tmp/template /tmp/alphabet  | head
  this is a a test
  of this system a
  this is a b test
  of this system b
  ...

이를 위해 매우 간단한 bash 스크립트를 작성했지만 CSV 스타일 데이터와 같은 데이터 행당 여러 매개변수를 허용하는 것을 고려하고 있습니다.

다음 시나리오에서 내 작은 스크립트보다 더 나은 것이 이미 존재합니까?

  • 기본 Unix posix 도구와 perl 또는 awk와 같은 일반적인 설치 도구만 필요하고 perl과 같은 추가 설치 모듈은 필요하지 않기를 원합니다.
  • 데이터 파일의 각 데이터 행에 대해 여러 데이터 열을 허용할 수 있습니다.
  • 기본적으로 bash 스크립트이므로 다른 것을 설치할 필요가 없습니다. :D
  • 또 다른 목적은 bash 스크립팅에 능숙하지 않은 사람들에게 중복 데이터 템플릿을 처리할 수 있는 간단한 도구를 제공하는 것입니다.

데이터와 템플릿은 매우 다양하지만 제가 수행하고 싶은 첫 번째 예는 JSON 페이로드에 4개의 ID를 적용하는 것입니다.

주형

{
  "tenantId": "{1}",
  "key": "some.key",
  "value": "some.value"
}

데이터

my/super/01cbf4e9779649038f0bd753747c8b26
my/test/01cbf4e9779649038f0bd753747c8b26
ez/test/01cbf4e9779649038f0bd753747c8b26
rad/data/df3a47fed39d453f836f9b2196332029

ez 템플릿

#!/usr/bin/env bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"; PATH="$DIR:$PATH"

function show_help()
{
  ME=$(basename "$0")
  IT=$(cat <<EOF

  replaces vars in a template, one for each line of stdin

  e.g.

  $ seq 1 2 | $ME 'this is a {1} test'
  this is a 1 test
  this is a 2 test

  $ $ME 'this is a {1} test' hi 'there now'
  this is a hi test
  this is a there now test

  $ $ME /tmp/template /tmp/alphabet
  this is a a test
  of this system a
  this is a b test
  of this system b
  ...

EOF
)
  echo "$IT"
  echo
  exit
}

if [ -z "$1" ]
then
  show_help
fi
if [ "$1" = "help" ] || [ "$1" = '?' ] || [ "$1" = "--help" ] || [ "$1" = "h" ]; then
  show_help
fi

function process_template(){
  DATA=$1
  VAR=$2

  if [ -f "$DATA" ]; then
    DATA=$(cat "$DATA")
  fi

  echo "$DATA" | sed "s#{1}#$VAR#g"
}


TEMPLATE=$1
if [ -t 0 ]
then
  if [ -f "$2" ]; then
    # allow first 2 parameters to be files, TEMPLATE and then DATA
    DATA_FILE=$2
    cat "$DATA_FILE" | while read line
    do
      process_template "$TEMPLATE" "$line"
    done 
  else
    shift;
    for line in "$@" 
    do
      process_template "$TEMPLATE" "$line"
    done
  fi
else
  # loop over lines from stdin
  while IFS= read -r line; do
    process_template "$TEMPLATE" "$line"
  done
fi

답변1

당신이 인용한 예에서 가장 자연스러운 해결책은 다음과 같습니다.

$ seq 1 2 | xargs -n1 printf 'this is a %s test\n'

필요한 경우 분명히 awk작업과 동일합니다.

관련 정보