Как я могу заставить Octave изменять переменные в моих входных файлах?

Я пытаюсь заставить Octave изменять переменные в моих входных файлах, как если бы я использовал командную строку в Ubuntu. Я разделил это на простой случай, когда я получил его, чтобы изменить "1111" на строку Naer_str и "2222" на строку sigma_str; печать результата в новый файл. 1111 и 2222 присутствуют в первом файле. Вот весь код, который я запускаю ниже.

 Naer_str= num2str(1000)

 disp(Naer_str)

 sigma_str = num2str(0.491)

 eval(['system(''sed -e "s~1111~${Naer_str}~; s~2222~${sigma_str}~;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN'');']);

Создается новый входной файл, но вместо того, чтобы видеть значения 1000 и 0.491, как я ожидал, места, где должно быть 0.491 и 1000, являются пустыми. Запуск в режиме отладки показал следующее сообщение об ошибке (которое я видел много с тех пор, как несколько дней назад начал использовать Octave, но я до сих пор не понимаю, что это значит).

 error: invalid use of script in index expression

Я попытался просто ввести материал в терминал Linux следующим образом:

 Naer_str=1000
sigma_Str=0.491
 sed -e "s/1111/${Naer_str}/; s/2222/${sigma_str}/;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN

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

Что вызывает это сообщение об ошибке? Почему я не вижу ожидаемого результата?

Ответ 1

  • Похоже, что у вас есть вызов system с вычисленной командой. Вы можете передать результат вычисления как параметр system() уже, вам не нужен, и не следует использовать здесь eval().

  • Способ конкатенации строк (массивов символов) в октаве - это просто горизонтальная конкатенация матрицы. Поэтому вместо 's~1111~${Naer_str}~' (который, как указывает abarnert, интерполируется оболочкой, которая не имеет понятия октавных переменных), вы можете написать ['s~1111~' Naer_str], а октава будет конкатенацией.

  • Вам не нужно достигать внешней октавы до sed через system() для замены текста. strrep и regexprep могут выполнять замену на массивах символов внутри октавы (или Matlab).

Ответ 2

Я не знаю, почему именно вы получаете эту ошибку, но я на 90% уверен, что это не будет делать то, что вы хотите:

eval(['system(''sed -e "s~1111~${Naer_str}~; s~2222~${sigma_str}~;" OctaveChangeVarTestFile.IN > OctaveChangeVarTestFile_out.IN'');']);

В bash, ${Naer_str} внутри строки с двумя кавычками находится подстановка переменных: она заменяет ${Naer_str} значением Naer_str переменной в строке, прежде чем передать его команде. Итак, sed получит s/1111/1000/; как одну из своих команд.

Но я не могу найти ссылку на такую ​​функцию в октаве Variables, Манипулирование строк, Strings или в другом месте. Эти персонажи просто будут рассматриваться как буквальные персонажи. Таким образом, sed получит s~1000~${Naer_str}~; в качестве аргумента, что означает, что он собирается выпустить мусор script. Похоже, что вы делаете это в октаве, используя форматирование в формате printf (как описано на странице "Манипулирующие строки" ).