sed на OSX вставляют в определенной строке

О каком терминале шпаклевка сообщает Вашим полям Linux? echo $TERM узнать. Вы могли бы попытаться установить это для xterm-окрашивания (может быть установлен в putty конфигурации сессии) для лучших результатов. Несколько символов и проблем поведения разглажены, когда они думают, что у Вас есть способный терминал.

24
18.10.2012, 00:09
5 ответов

Строго говоря, спецификация POSIX для sed требует новой строки после a\:

[1addr]a\
text

Запишите текст в стандартный вывод, как описано ранее.

Это делает остроты записи чем-то вроде боли, которая является, вероятно, причиной следующего расширения GNU a, i, и c команды:

Как расширение GNU, если между a и новая строка там отличается от пробела -\ последовательность, затем текст этой строки, запускающейся в первом непробельном символе после a, взят в качестве первой строки текстового блока. (Это включает упрощение в сценариях короткого, добавляют.) Это расширение также работает с i и c команды.

Таким образом, чтобы быть портативным с Вашим sed синтаксис, необходимо будет включать новую строку после a\ так или иначе. Самый легкий путь состоит в том, чтобы просто вставить заключенную в кавычки новую строку:

$ sed -e 'a\
> text'

(где $ и > приглашения оболочки). Если Вы находите что боль, bash [1] имеет $' ' при заключении в кавычки синтаксиса для вставки Escape C-стиля поэтому просто используйте

sed -e 'a\'$'\n''text'

[1] и mksh (r39b +) и некоторые оболочки Bourne неудара (например,/bin/sh в FreeBSD 9 +)

24
27.01.2020, 19:40
  • 1
    Очень информативный ответ. Спасибо за подсказку на синтаксисе заключения в кавычки удара. –  cjackson 20.01.2017, 19:21

Как описано в этом ответе, это полезно при использовании sed команд как i и a использовать несколько -e "..." пункты. Каждый из этих пунктов, как будут понимать, будет разделен новыми строками. i и a команды трудно использовать во встроенных sed сценариях иначе (они разработаны для использования в мультилинии sed, файл сценария вызвал использование sed -f file ...). Похоже, что Вы не можете использовать неявную новую строку, представленную к концу -e пункт для разделения a\ и строка текста это должно быть добавлено. Но можно использовать его для завершения строки текста, это должно быть добавлено.

В этом конкретном случае, что Вы пытаетесь сделать, мог бы на самом деле быть выполнен с синглом -e ... пункт. Просто необходимо использовать a управляйте правильно. По стандарту POSIX, a потребности, которые будут сопровождаться a \, затем это должно сопровождаться новой строкой, затем остаток от следующей строки будет вставлен (пока новая строка или конец -e с пунктом встречаются). Таким образом, Вы могли сделать:

sed -i "" -e $'4 a\\\n'"mode '0755'" file.txt
14
27.01.2020, 19:40
  • 1
    Если Вы хотите разобраться в том, какими функциями, на которые Вы полагались, являются измы Гну, эта страница может помочь: wiki.alpinelinux.org/wiki/Regex. Это ограничено просто regex функциями, хотя; не другие команды sed. –  dubiousjim 18.10.2012, 00:40

GNU sed, кажется, является намного более наиболее часто используемым, чем POSIX sed, на основе примеров/учебных руководств, которые я использовал так или иначе.

Я нашел, что намного легче только установить GNU sed на любой машине OSX, которую я использую. Если Вам интересно, лучший способ сделать, это - установка он через Домашнее пиво.

Вы можете любой просто $ brew install gnu-sed, или получите все общие утилиты GNU с $ brew install coreutils.

Затем, когда Вы сталкиваетесь с проблемой синтаксиса с date или некоторая другая программа можно просто использовать версию GNU. В конечном счете я просто решил, что было легче всегда использовать версии GNU и поместить их ранее, чем версии системы в моем PATH.

5
27.01.2020, 19:40

Perl не переносит от такого зависимого платформы GNU по сравнению с не-GNU по сравнению с "собственными" особенностями. Вы могли сделать:

perl -ni.old -e 'print;if ($.==4) {print "mode 0755\n"}' file

-n' option creates a loop that reads every line of the input file. Unlike its cousin- p(not used here) it doesn't automatically print every line read. The- яinvokes in-place replacement. The argument to- я(viz. ".old") can be dropped or changed. It leaves a backup of the unmodified file. The -e сигнализирует о начале сценария.

$. обозначает номер строки, начинаясь со строки 1. Таким образом командная строка читает 'файл' и когда номер строки равняется 4, это печатает ту строку, сопровождаемую тем, что Вы хотите ввести.

Я спешил бы добавлять, что Perl должен свои корни sed, AWK и C, таким образом, синтаксис для простых замен, и т.д. не очень крутая кривая обучения.

5
27.01.2020, 19:40

Простая демонстрация:

$ date | sed -E $'1i\\\nfoo\n'
foo
Thu Aug  6 07:09:01 CDT 2020

$'...'— это башизм для принудительного развертывания управляющей последовательности. При его использовании вы должны использовать \\, чтобы получить литерал \в строке.

0
06.08.2020, 12:13

Теги

Похожие вопросы