Как я могу заставить 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 (как описано на странице "Манипулирующие строки" ).