Передача переменной awk, файлы с пробелами

Espeak поддерживает язык разметки синтеза речи (SSML ), и вы можете просто поместить эти теги в середину простого текстового файла (, т.е. вам не нужно преобразовывать все целиком что касается правильного SSML ). Тег, который вы ищете, вероятно, . Другие возможные теги перечислены здесь:http://espeak.sourceforge.net/ssml.html

Espeak не будет использовать их по умолчанию, вам нужно будет передать флаг -m. Например, вы можете использоватьespeak -m -f your_file.txt

Документация довольно краткая, поэтому вам, возможно, придется погрузиться в исходный код, чтобы найти такие вещи, как возможные значения. (Я бы написал документацию получше, но есть неслитые патчи девятилетней давности и исходный репозиторий недоступен, поэтому кажется, что проект полностью мертв. )Возможные значения тега выделения (и некоторых других тегов )можно найти здесь на Github . Они:

  • нет
  • уменьшенный
  • умеренный
  • сильный
  • x -сильный

Например,:Did you mean the green beans?Обратите внимание, что это не будет работать без кавычек (, в то время как будет работать в HTML, но не будет работать без кавычек в SSML/espeak ).

В качестве альтернативы, espeak может по-разному читать слова, написанные прописными буквами, используя флаг -k:, если вы используете команду espeak -k20 -f your_file.txt, вы заметите, что она меняет высоту тона для слов, написанных «ПОЛНЫМИ ЗАГЛАВНЫМИ». Эти две опции не смешиваются, поэтому вы не можете выделить и изменение высоты тона, используя обе опции.

Однако в SSMLвы можете смешивать их:Did you mean the green beans?будет читаться как с акцентом, так и с более высоким тоном.

1
11.06.2020, 17:16
2 ответа

Чтобы передать groupв awk как переменную, вам нужно -v group="developers"и чтобы awk обрабатывал ее как переменную (, а не строковый литерал ), он должен быть вне двойных кавычек, например

awk -v group="developers" '{print "changegrp " group " \""$0"\""}'

Тем не менее, вы можете избежать многих головных болей, используя что-то вроде

find. -type d -name '* *' -exec changegrp developers {} \;

или (, если changegroupподдерживает несколько файловых аргументов -Я не знаком с конкретной командой)

find. -type d -name '* *' -exec changegrp developers {} +

См. также

2
28.04.2021, 23:14

Обойти findи awkи предположить, что вас интересуют только каталоги (в соответствии с вашим первым фрагментом кода):

shopt -s globstar dotglob nullglob

for name in./**/*' '*; do
    [[ -d $name ]] && [[ ! -L $name ]] && changegrp developers "$name"
done

или,

shopt -s globstar dotglob nullglob

for name in./**/*' '*/; do
    [[ ! -L ${name%/} ]] && changegrp developers "$name"
done

Здесь используется простой цикл для выполнения команды changegrpдля каждого каталога, в имени которого есть хотя бы один пробел. Это делается с помощью шаблона подстановки **(, включенного с помощью параметра оболочки globstarв bash), который соответствует подкаталогам. Параметры оболочки nullglobи dotglobиспользуются для того, чтобы оболочка удаляла несопоставленные шаблоны, а также сопоставляла скрытые имена.

Тест -Lиспользуется здесь для исключения символических ссылок на каталоги (тест -dбудет истинным как для каталогов, так и для символических ссылок на каталоги ).

Во втором варианте приведенного выше кода мы выбираем только каталоги, добавляя /в конце шаблона. Эту косую черту нужно убрать для теста -L, что и делает ${name%/}.

Тогда было бы легко сделать строку developersпеременной:

shopt -s globstar dotglob nullglob

group=developers

for name in./**/*' '*; do
    changegrp "$group" "$name"
done

(Этот код дополнительно применяется changegrpк всем именам, которые содержат пробелы в текущем каталоге или под ним, в соответствии с другими фрагментами кода в вопросе.)

1
28.04.2021, 23:14

Теги

Похожие вопросы