SED errore di comando su MACOS X

Sto cercando di eseguire questo comando su MacOSX terminale , che inizialmente era stato concepito per funzionare su Linux

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’è un modo ho potuto modificare il comando di cui sopra a lavorare su MacOSX terminale

 

5 Replies
  1. 32

    Rifugio è a destra, ma c’è un altro modo per farlo. È possibile utilizzare il bash $'...' citando interpretare le fughe prima di passare la stringa sed.

    Così:

             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
    

    Questa risposta su unix.stackexchange.com mi ha portato a questa soluzione.

    • 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. E. g. sed-i.tmp ‘2i\’$’\n'”$RIGA”$’\n’ $FILE
    • Tanto <3 per la spiegazione sforzo
  2. 14

    Avuto lo stesso problema e risolto con brew:

    brew install gnu-sed

    gsed YOUR_USUAL_SED_COMMAND

    Se si desidera utilizzare il comando sed, quindi è possibile impostare un alias:

    alias sed=gsed

    • In alternativa, è possibile installare gnu-sed con l’opzione --with-default-names alla fine, quindi installato gnu sed avrà la sed nome.
  3. 5

    OSX seds si basano su versioni precedenti, è necessario essere molto più letterale tuo sapere con sed, E sei fortunato, in questo caso, sed ti dice esattamente cosa fare. Non testati non ho OSX, ma provare

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

    Ingresso tramite il i cmd è terminato da una riga vuota. Altre sed istruzioni può seguire dopo. Nota, NON caratteri dopo il \ char!

    Anche, @StephenNiedzielski è giusto. Utilizzare le virgolette singole caratteri per avvolgere il vostro sed dichiarazioni. (se avete bisogno di espansione di una variabile all’interno del vostro sed e può sfuggire altri usi di $, allora si può utilizzare anche dbl-citazioni, ma non è raccomandato come una normale prassi.

    modifica

    A quanto ho capito ora che si sta facendo questo da riga di comando, e non in uno script o un altro editor, ho testato di cui sopra, e…. tutto quello che posso dire è che la famosa battuta di assistenza tecnica … “a me funziona”. Se stai ricevendo un messaggio di errore

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

    quindi quasi sicuramente hanno aggiunto un po ‘ di carattere dopo la \. Ho appena provato, e ho ottenuto il messaggio di errore sopra riportato. (Sto usando una versione per linux di sed, quindi, i messaggi di errore sono esattamente gli stessi). Si dovrebbe modificare la tua domanda per includere un’esatta copia-incolla della riga di comando e il nuovo messaggio di errore. Utilizzando ricci-singolo-preventivi non funziona.

    IHTH

    • Testato su Mac OS X, e funziona, anche se la riga vuota è semplicemente un vuoto di comando (per incorporare i ritorni a capo nel testo, è necessario terminare la linea con una barra rovesciata).
    • Io cerco e ho ottenuto il seguente messaggio: caratteri aggiuntivi dopo \ al fine di comando
    • se si utilizza il vi o vim editor, accendere la lista cmd, cioè :set list, e scommetto che vedere spazi vuoti dopo il \` char. You can't use a word processor to write a sed` script ; -) !!! buona fortuna.
    • Io sto usando il MACOSX TERMINALE
    • Grazie per questo; è implicita da quello che dici, ma per essere più espliciti: non finiscono il ultima (o solo) linea di testo con \ – necessario solo per la interni linee multi-line testo.
  4. 4

    Ecco come ho lavorato su OS X. Nel mio caso, ho dovuto precedere il testo da un file. A quanto pare, moderno sed opere come questa:

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

    Ma su OS X ho dovuto effettuare le seguenti operazioni:

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

    Sembra copiato rich text. Le virgolette dovrebbero essere dritte, non ricci:

    sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' 
    
    • Buon punto circa le virgolette, ma che da solo non risolve l’OP OSX problema specifico.

Lascia un commento