Скрипты оболочки: данные в текстовый файл шаблона - PullRequest
0 голосов
/ 27 февраля 2020

Я хотел бы создать скрипт, который принимает некоторые текстовые данные и создает текстовый файл в соответствии с предварительно созданным файлом шаблона.

Ожидаемое функционирование будет выглядеть примерно так: я создал текстовый файл шаблона

Today we describe <text1>.
<text2>
Hope you enjoyed the topic of today!

, и я хотел бы автоматически создавать файлы с указанными данными <text1> и <text2> в качестве входных данных. Я полагаю, использование было бы наиболее удобным, если бы я мог просто сохранить <text1> и <text2> в качестве первой и второй строки текстового документа. Итак, предположим, что я создал файл input.txt всего с двумя строками (или каким-либо другим разделителем, кроме разрыва строки, если он лучше):

flowers
Flowers form a subset of plants. They are often beautiful.

Тогда я бы хотел, чтобы при запуске sh description.sh получалось мне файл flowers.txt с содержимым

Today we describe flowers.
Flowers form a subset of plants. They are often beautiful.
Hope you enjoyed the topic of today!

Итак, вопрос в том, каким должно быть содержимое description.sh, чтобы оно функционировало так?

Я новичок в создании сценариев оболочки так что, вероятно, я не могу искать с правильными ключевыми словами, чтобы выяснить, легко ли такое или здесь уже отвечали много раз. Я также ценю объяснения вместе с правильной строкой кода, чтобы узнать больше. Извините и спасибо за вашу помощь!

1 Ответ

0 голосов
/ 27 февраля 2020

Это будет делать то, что вы собираетесь. Он сгенерирует файл с именем 'result.txt'.

Будьте осторожны с вашими данными, так как вам может понадобиться экранировать, чтобы sed работал должным образом.

execute. sh:

#!/bin/bash

[[ "$#" -ne 2 ]] && { echo "This command requires two parameters. A dictionary and a template. Example : ./execute.sh dict.txt template.txt"; exit 1;}

dict=$1 && shift
template=$1 && shift
tmpfile="$(mktemp /tmp/executor_XXXXXXXXXXX)"

declare -a words
cntr=1
while read line
do
    words[cntr]="$line"
    (( cntr++ ))    
done <<< "$( cat input.txt )"

cat "$template" > "$tmpfile"
for((i=1; i <= "${#words[@]}" ; i++ ))
do
    sed -i "s/<$i>/${words[$i]}/g" "$tmpfile"
done

cat "$tmpfile" > result.txt

использование:

./execute.sh input.txt template.txt

Кроме того, я изменил логи шаблонов c, поэтому вам нужно набрать <1> вместо <text1>, так как требует меньше печатания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...