2015-05-01 8 views
11

Sto cercando di convincere Octave a modificare le variabili nei miei file di input come se usasse la riga di comando in Ubuntu. L'ho spogliato in un semplice caso in cui ho avuto la possibilità di cambiare "1111" nella stringa Naer_str e "2222" nella stringa sigma_str; stampando il risultato in un nuovo file. 1111 e 2222 sono entrambi presenti nel primo file. Ecco l'intero codice che sto seguendo qui sotto.Come posso ottenere da Octave la modifica delle variabili nei miei file di input?

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'');']); 

Il nuovo file di input è fatto, ma piuttosto che vedere i valori 1000 e 0.491, come ho anticipato i luoghi dove 0.491 e il 1000 dovrebbe essere sono vuoti. L'esecuzione in modalità debug ha mostrato il seguente messaggio di errore (che ho visto molto da quando ho iniziato ad usare Octave qualche giorno fa, ma ancora non capisco cosa significhi).

error: invalid use of script in index expression 

ho cercato solo roba inserendo nel terminale di Linux in questo modo:

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

Questo sembra funzionare bene, quindi immagino che devo aver commesso un errore di grammatica o utilizzando il sistema o eval, ma non riesco a vederlo.

Che cosa sta causando questo messaggio di errore? Perché non vedo la mia uscita prevista?

+7

Se hai intenzione di votare questa domanda, posso chiederti di lasciare un commento. Sono sinceramente all'oscuro di ciò che ho fatto di sbagliato. –

+1

Questa non sembra una domanda di programmazione, anche se non conosco gli strumenti. Quest'ultima parte è l'unica ragione per cui non ho votato per nulla o votato per chiudere come off-topic. –

+0

Octave esegue effettivamente la sostituzione '$ {...}' nelle stringhe allo stesso modo di bash, ma anche all'interno di stringhe con quotatura singola? In caso contrario, non invierai mai la stessa cosa a "sed", invierai spazzatura che probabilmente prende solo le stringhe letterali. Quindi quello che finisci per cercare di valutare è spazzatura. – abarnert

risposta

3
  1. Sembra che tutto quello che hai è una chiamata system con un comando calcolato. È possibile passare un risultato di calcolo come il parametro di system() già, non è necessario e non deve essere utilizzato, eval() qui.

  2. Il modo per concatenare stringhe (matrici di caratteri) in ottava è solo la concatenazione di matrici orizzontali. Quindi invece di 's~1111~${Naer_str}~' (che come sottolinea l'abarnert, viene interpolato dalla shell che non ha alcun concetto di variabile di ottava) è possibile scrivere ['s~1111~' Naer_str] e l'ottava si concatena.

  3. Non è necessario raggiungere l'ottava esterna a sed tramite system() per la sostituzione del testo. strrep e regexprep possono eseguire la sostituzione su array di caratteri all'ottava (o Matlab).

+0

Sto cercando di modificare un file fuori da ottava con questo comando. Ho avuto un po 'di giro con questi suggerimenti ma non posso aggirare il fatto che ho bisogno di passare il contenuto e non il nome di una stringa nel sistema. Utilizzando ['s ~ 1111 ~' Naer_str]. Non sto cercando di cambiare il testo in un file che si trova fuori ottava. Non riesco a vedere come si possa concepire che stai usando stryp o regexprep ma forse sono solo stupido. Grazie comunque per lo sforzo. :) –

+0

@Reluctant_Linux_User: O (1) leggi il file in ottava, usa 'strrep', e riscrivilo, o (2) usa' system' e la concatenazione dell'array di caratteri '['sed -e' s ~ 1111 ~ 'Naer_str' ~; "']' per costruire una stringa di comando che contiene già i valori della variabile di ottava. –

+0

L'opzione 1 sarà complicata, è un file veramente grande ma potrebbe funzionare. L'opzione 2 è esattamente quello che ho provato e che non ha funzionato, ma in realtà ho letto il tuo commento, ho capito qual è il problema, entrambi abbiamo perso la chiusura "nella dichiarazione sed (Oysh, avrei dovuto vederlo!) –

8

Non so il motivo per cui in particolare che stai ricevendo questo errore, ma sono sicuro che il 90% questo non farà ciò che si vuole:

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

In bash, ${Naer_str} all'interno di un doppio citato string è un variable substitution: sostituisce lo ${Naer_str} con il valore della variabile Naer_str nella stringa, prima di passarlo al comando. Quindi, sed otterrà s/1111/1000/; come uno dei suoi comandi.

Ma io non riesco a trovare alcun riferimento a tale caratteristica in di Variables, Manipulating Strings, ottava Strings, o altrove. Quei personaggi saranno trattati come personaggi letterali. Quindi, sed otterrà s~1000~${Naer_str}~; come argomento, il che significa che sta per produrre uno script di garbage. Sembra che il modo in cui esegui questo tipo di ottava è usando la formattazione in stile printf (come descritto in tutta la pagina Manipulating Strings).

+0

Giusto quindi pensi che sia dovuto all'uso del simbolo del dollaro? Ho pensato che usando eval (['system (' 'INSERTCODEHERE' ');']); Che la riga INSERTCODEHERE sia stata effettivamente eseguita nella shell non è corretta? –

+0

@Reluctant_Linux_User: Sì, quella linea viene eseguita nella shell ... ma la shell non ha accesso alle variabili che hai creato in qualche altro programma (a meno che l'octave non memorizzi le sue globali nel 'environ' del processo, che dubito). – abarnert