나는 종종 일부 데이터를 빠르게 가져와 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
작업과 동일합니다.