Команда sed insert line OSX

Я пытаюсь вставить текст в третью строку в файле с помощью sed, а синтаксис, который я нашел на других форумах, это:

sed -i '' "3i\ text to insert" file

Когда я использую это, я получаю сообщение об ошибке:

sed: 1: "3i\ text to insert": extra characters after \ at the end of i command

Я не могу понять, что вызывает проблему. Я использую OSX, поэтому у меня есть пустой "как расширение".

Спасибо!

Ответ 1

Вы должны поставить новую строку сразу после \:

sed '3i\
text to insert' file

Это на самом деле поведение, определенное в спецификации POSIX. Тот факт, что GNU sed позволяет вам указывать текст, который будет вставлен в одну строку, является расширением.


Если по какой-либо причине вам необходимо использовать двойные кавычки вокруг команды sed, вы должны экранировать обратную косую черту в конце первой строки:

sed "3i\\
text to insert" file

Это связано с тем, что оболочка сначала обрабатывает строку в двойных кавычках, а удаляется \, за которым следует символ новой строки:

$ echo "abc\
def"
abcdef

Ответ 2

В OSX вы можете использовать:

sed -i.bak '3i\
text to insert
' file

Ответ 3

Здесь, как это сделать в синтаксисе одной строки

sed -i '' -e "2s/^//p; 2s/^.*/text to insert/" file
  • дублировать вторую строку: 2s/^//p;

  • замените новую строку текстом: 2s/^.*/text to insert/

Ответ 4

Это работает для меня

sed -i '' '3i\
text to insert' file 

Ответ 5

Если вы хотите изменить файл определенного типа файла (.sh в моем случае), используйте эту команду.

sed -i '.sh' '3i\
mymodified text to insert' temp.sh

Убедитесь, что у вас есть разрыв строки после слэша ( "\" )

Ответ 6

Одна строка для OSX, использующая цитирование ANSI-C:

sed -i '' '3i\'$'\n''text to insert' file

Адаптировано из fooobar.com/info/146335/...