Ошибка команды SED на MACOS X

Я пытаюсь запустить эту команду на терминале MacOSX, изначально предназначенный для работы в Linux

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

но это дает мне ошибку:

command i expects \ followed by text. 

Можно ли каким-либо образом изменить приведенную выше команду для работы с терминалом MacOSX

Ответ 1

Приют прав, но есть другой способ сделать это. Вы можете использовать цитирование bash $'...' для интерпретации экранов перед передачей строки в sed.

Итак:

         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

Этот ответ на unix.stackexchange.com привел меня к этому решению.

Ответ 2

Имел ту же проблему и решил ее с помощью brew:

brew install gnu-sed

gsed YOUR_USUAL_SED_COMMAND

Если вы хотите использовать команду sed, вы можете установить псевдоним:

alias sed=gsed

Ответ 3

OSX sed основаны на более старых версиях, вам нужно быть более буквальным в своих направлениях для sed, и вам повезло, в этом случае sed сообщает вам, что именно делать. Непроверенный, поскольку у меня нет OSX, но попробуйте

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

' init.txt >> ~/.bash_profile

Ввод через i cmd завершается пустой строкой. После этого могут следовать другие инструкции sed. Обратите внимание: символы NO после \ char!

Кроме того, @StephenNiedzielski прав. Используйте символы одиночной кавычки, чтобы обернуть ваши команды sed. (если вам нужно переменное расширение внутри вашего sed и может избежать других применений $, тогда вы также можете использовать dbl-кавычки, но это не рекомендуется в качестве обычной практики.

изменить

Как я понимаю, теперь вы делаете это из командной строки, а не в script или другом редакторе, я протестировал выше, и... все, что я могу сказать, это знаменитая строка из технической поддержки... "Это работает для меня". Если вы получаете сообщение об ошибке

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

вы почти наверняка добавили символ после \. Я только что проверил это, и у меня появилось сообщение об ошибке выше. (Я использую версию sed, поэтому сообщения об ошибках точно такие же). Вы должны отредактировать свой вопрос, чтобы включить точную вырезку вашей командной строки и сообщение об ошибке новое. Использование курсивно-одиночных кавычек не будет работать.

IHTH

Ответ 4

Вот как я работал над OS X. В моем случае мне нужно было добавить текст в файл. По-видимому, современный sed работает следующим образом:

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

Но на OS X мне пришлось сделать следующее:

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

Ответ 5

Похоже, вы скопировали богатый текст. Одиночные кавычки должны быть прямыми, а не курчавыми:

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