2013-02-13 13 views
14

Sto cercando di eseguire questo comando sul terminale MacOSX, che inizialmente doveva essere eseguito su Linuxerrore di comando SED su MacOS X

sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' init.txt >> ~/.bash_profile 

ma mi dà l'errore:

command i expects \ followed by text. 

è c'è modo in cui posso modificare il comando sopra per lavorare sul terminale MacOSX

risposta

1

Sembra che tu abbia copiato il testo. Le virgolette non devono essere dritte graffe:

sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' 
+0

Buon punto sulle citazioni, ma questo da solo non risolve il problema specifico dell'OSP dell'OP. – mklement0

5

OSX sed s si basano su versioni precedenti, è necessario essere molto più letterale tuo itinerario fino a sed, E sei fortunato, in questo caso, sed ti sta dicendo esattamente cosa fare. Testato come non ho OSX, ma cerco

sed '1 i\ 
VISPATH=/mnt/local/gdrive/public/3DVis 

' init.txt >> ~/.bash_profile 

ingresso tramite i i cmd è terminato da una riga vuota. Altre istruzioni sed possono seguire dopo. Nota, NESSUN caratteri dopo il carattere \!

Inoltre, @StephenNiedzielski ha ragione. Usa i singoli caratteri di citazione per avvolgere le tue dichiarazioni sed. (Se avete bisogno di espansione variabile all'interno del vostro sed e possono sfuggire altri usi di $, allora si può anche utilizzare DBL-citazioni, ma non è raccomandato come un normale prassi.

modificare

quanto ho capito ora che stai facendo questo dalla riga di comando, e non in uno script o altro editor, ho provato quanto sopra, e .... tutto quello che posso dire è la famosa linea dal supporto tecnico ... "Funziona per me ". Se ricevi un messaggio di errore

sed: -e expression #1, char 8: extra characters after command 

quindi quasi sicuramente avete aggiunto qualche carattere dopo lo \. L'ho appena testato e ho ricevuto il messaggio di errore sopra riportato. (Sto usando una versione Linux di sed, quindi i messaggi di errore sono esattamente gli stessi). È necessario modificare la domanda per includere un cut-paste esatto della riga di comando e il nuovo messaggio di errore . L'uso di virgolette singole non funzionerà.

IHTH

+1

Testato su Mac OS X; funziona, sebbene la linea vuota sia semplicemente un comando vuoto (per incorporare le nuove righe nel testo, devi terminare la riga con una barra rovesciata). –

+0

Lo provo e ho ricevuto il seguente messaggio: caratteri extra dopo \ alla fine del comando i – user2067030

+0

se stai usando l'editor 'vi' o' vim', attiva l'elenco cmd, ovvero ': set list', e scommetto che vedi i personaggi dello spazio bianco dopo il tuo '\\' char. Non è possibile utilizzare un word processor per scrivere uno script 'sed'; -) !!! in bocca al lupo. – shellter

4

Ecco come ho lavorato fuori su OS X. Nel mio caso, avevo bisogno di anteporre il testo in un file. A quanto pare, moderne opere sed come questo:

sed -i '1i text to prepend' file.txt 

Ma su OS X che ho dovuto fare le seguenti operazioni:

sed -i '' '1i\ 
text to prepend 
' file.txt 
29

Shelter è giusto, ma c'è un altro modo per farlo. È possibile utilizzare la citazione bash $'...' per interpretare gli escape prima di passare la stringa a sed.

Quindi:

  sed -iold '1i\'$'\n''text to prepend'$'\n' file.txt 
         ^^^^^^^^     ^
        /|\|||/ \     |__ No need to reopen 
        | | \|/ |       string to sed 
    Tells sed to | | | | 
    escape the next _/ | | +-----------------------------+ 
     char   | +-------------+     | 
         |    |     | 
        Close string The special bash Reopen string to 
        to sed  newline char to  send to sed 
            send to sed 

This answer su unix.stackexchange.com mi ha portato a questa soluzione.

+9

+1 per una bella illustrazione! – shellter

+0

Questa è l'unica soluzione che ha funzionato per me su OS X in uno script bash quando si utilizza una variabile. Non elegante ma funziona e dovrebbe essere portatile. Per esempio. sed -i.tmp '2i \' $ '\ n' "$ LINE" $ '\ n' $ FILE – djule5

+0

Molto <3 per lo sforzo esplicativo –

10

avuto lo stesso problema e risolto con brew:

brew install gnu-sed

gsed YOUR_USUAL_SED_COMMAND

Se si desidera utilizzare il comando sed, allora si può impostare un alias:

alias sed=gsed

+2

ha fatto il trucco, grazie – jarandaf

+2

In alternativa, è possibile installare 'gnu-sed 'con l'opzione' --with-default-names' alla fine, quindi il gnu-sed installato avrà il nome 'sed'. –

+1

Oh grazie grazie! – abalter