Удалите пробелы между словами и измените регистр с верхнего на нижний, затем перенесите в новый файл

  • Переменная без кавычек будет подвергаться расширению переменной, слову -разделяться (на пробелы, табуляции и новые строки по умолчанию ), а каждое сгенерированное слово, в свою очередь, будет подвергаться генерации имени файла (подстановке ).
  • Значение переменной, заключенной в двойные кавычки, будет расширено, но оболочка не будет -выполнять разбиение или подстановку слова в расширенном значении.
  • Переменная в одинарных кавычках вообще не раскрывалась.

Пример:

$ ls
script.sh
$ var='* *'
$ echo $var
script.sh script.sh
$ echo "$var"
* *
$ echo '$var'
$var

В вашем коде есть две проблемы, из-за которых значение в $extensionрасширяется до содержащегося в нем шаблона подстановки, а также приводит к преждевременному сопоставлению шаблона подстановки с именами файлов (вы хотите передать его как -— это ffmpeg -i, который выполняет внутреннее расширение глобуса ).

Первый — это вызов вашей функции:

runprintcommand ffmpeg -loglevel verbose -pattern_type glob -i ${extension} "$movieName" ;

Здесь ${extension}не заключено в кавычки, поэтому вы определенно получите (разбиение на слова -и )подстановку имени файла, происходящую по его значению.

Вторая проблема связана с самой функцией:

function runprintcommand() {
    echo "Command to run: (Note: '\\' escape character may not be printed)" ;
    echo "$*" ;
    $* ;    
}

Здесь вы используете $*без кавычек, что снова (разбивает значение на слова, а затем )расширяет глобус, даже если вы дважды -цитируете ${extension}в вызове функции.

Вместо простого $*используйте"$@"(с двойными кавычками ). Это будет расширено до отдельно цитируемых позиционных параметров функции.

В этом разница между "$@"и"$*":

  • "$*"— это одинарная двойная -строка в кавычках . Обычно это нельзя использовать для выполнения команды с аргументами.
  • "$@"— это список слов в двойных кавычках . Это можно использовать для выполнения команды с аргументами.
0
16.10.2019, 03:17
1 ответ

Я вижу как минимум 3 вещи:

  1. Модификатор \Uпреобразует в верхний регистр, в то время как вас попросили преобразовать из верхнего регистра в нижний

  2. Похоже, ваше выражение вообще не удаляет пробелы -это, вероятно, проще всего сделать как отдельное выражение, например. s/ //gили (для замены горизонтальных пробелов в более общем смысле)s/[[:blank:]]//g

  3. Использование-i(или--in-place)не имеет смысла, если вы хотите перенаправить или направить вывод команды в другой файл или процесс.

Собрав все это вместе, вы могли бы использовать

sed -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile > newfile

Если вы хотите сначала изменить oldfileна месте, а затем перенести содержимое в newfileс помощью перенаправления, вы можете сделать это, по крайней мере, в GNU sed, используя:

sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' -e 'w /dev/stdout' oldfile | tee newfile

Обратите внимание, что вам необходимо явно записать в /dev/stdout, так как измененный файл не записывается в стандартный вывод по умолчанию, когда используется опция -i.

В качестве альтернативы (и проще )переместите или скопируйте измененный файл:

sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile && cp oldfile newfile
2
28.01.2020, 02:29

Теги

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