Написание сценария Bash, который принимает текстовый файл в качестве входных данных и передает текстовый файл через несколько команд - PullRequest
0 голосов
/ 12 июля 2020

Я храню текстовые файлы с определениями в папке. Мне нравится преобразовывать их в устное слово, чтобы я мог их слушать. Я уже делаю это вручную, выполнив несколько команд, чтобы вставить некоторые коды предварительной обработки в текстовые файлы, а затем преобразовать текст в устное слово следующим образом:

sed 's/\..*$/[[slnc 2000]]/' input.txt вставляет контрольный код после первого периода

sed 's/$/[[slnc 2000]]/' input.txt" вставляет управляющий код в конец каждой строки

cat input.txt | say -v Alex -o input.aiff

Вместо того, чтобы каждый раз вводить их заново, я хотел бы создать сценарий Bash который передает вывод этих команд конечному продукту. Я хочу вызвать сценарий с именем сценария, за которым следует аргумент входного файла для текстового файла. Я хочу сохранить исходный текстовый файл, чтобы, если я открою его снова, ни один из управляющих кодов не будет фактически вставлен, так как единственная цель управляющих кодов - вставлять паузы в аудиофайл.

I ' Я пытался написать

#!/bin/bash 
FILE=$1
sed 's/$/ [[slnc 2000]]/' FILE -o FILE

Но я сразу же повесил трубку, так как написано: sed: -o: Нет такого файла или каталога. Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Если вы просто хотите использовать foo.txt для создания foo.aiff с управляющими символами, вы можете сделать:

#!/bin/sh

for file; do
  test "${file%.txt}" = "${file}" && continue
  sed -e 's/\..*$/[[slnc 2000]]/' "$file" | 
    sed -e 's/$/[[slnc 2000]]/' | 
    say -v Alex -o "${file%.txt}".aiff
done

Вызвать скрипт с вашими .txt-файлами в качестве аргументов (например, ./myscript *.txt ), и он сгенерирует файлы .aiff. Имейте в виду, что если say перезаписывает файлы, то это тоже произойдет. На самом деле вам не нужны два вызова sed, и вызов sed, который вы вызываете, можно очистить, но я не хочу отвлекаться от основной проблемы здесь, поэтому я оставляю это как есть.

1 голос
/ 13 июля 2020

Это будет: -

a} Составьте список ваших текстовых файлов для обработки в текущем каталоге с помощью find.

b} Примените команды sed к каждому текстовому файлу в list, но только для текущего использования, что позволит вам сохранить их в неприкосновенности.

c} Вызов "say" для отредактированных файлов.

Я не могу сказать, поэтому могу ' t проверить это или контрольные коды; но пока есть Эд, l oop работает. Я использовал это много раз. Я узнал это в результате знакомства с FORTH, языком, который все еще допускает незавершенные циклы. Раньше у меня были проблемы с запоминанием вызова next в конце скрипта, чтобы запустить его, но я преодолел это, определив сначала свои слова (функции) в стиле FORTH, а затем всегда помещая свои одноразовые команды в конец.

#!/bin/sh

next() {
[[ -s stack ]] && main
end
}

main() {
line=$(ed -s stack < edprint+.txt)
infile=$(cat "${line}" | sed 's/\..*$/[[slnc 2000]]/' | sed 's/$/[[slnc 2000]]/')
say "${infile}" -v Alex -o input.aiff
ed -s stack < edpop+.txt
next
}

end() {
rm -v ./stack
rm -v ./edprint+.txt
rm -v ./edpop+.txt
exit 0
}

find *.txt -type -f > stack

cat >> edprint+.txt << EOF
1
q
EOF

cat >> edpop+.txt << EOF
1d
wq
EOF

next
...